Ubuntu Weekly Recipe:第12回 ポインティングデバイスのカスタマイズ(1):トラックポイント・タッチパッドのカスタマイズ|gihyo.jp … 技術評論社

ホイールエミュレーション(縦)

Ubuntuでもトラックポイントは標準インストールで利用できますが,デフォルト状態では「マウスホイールに相当するスクロール機能」がありません。このため,ブラウザなどで縦に長いページをスクロールするには,キーボードを操作するか,あるいはスクロールバーをクリックして操作する必要があります。

Thinkpadなどのように3ボタン構成のトラックポイントでは,多くのメーカーの工場出荷時設定では(つまり,Windowsでは)「中ボタンを押しながらトラックポイントを操作する」ことで,マウスホイール操作に代替するように設定されています。

同じことがUbuntuでも可能です。/etc/X11/xorg.confの「Section "InputDevice"」に,以下の設定項目を追加します。

Option          "EmulateWheel"  "true"
Option          "EmulateWheelButton"    "2"

追加後,[Ctrl]+[Alt]+[Backspace]でXを再起動してください。この設定を行うことで,中ボタンを押しながらトラックポイントを操作すると,ホイールマウスと同様の縦スクロールを利用することができるようになります。

なお,[Fn]もしくは[Ctrl]を押しながらトラックポイントを操作することで,ハードウェアレベルで実現されたホイールエミュレーションが利用できる可能性もあります。設定を行う前に試してみてください。

ホイールエミュレーション(横)

また,さらに以下の設定を追加することで,トラックポイントを用いた横スクロールを行うことができます。

Option          "YAxisMapping"        "4 5"
Option          "XAxisMapping"        "6 7"

ただしFirefoxなどのGecko系ブラウザでは,横マウスホイールは「進む」・「戻る」に割り付けられています。このため,この設定を行うと誤操作が誘発される恐れがあります。Firefoxの場合は以下の設定を行い,この設定を無効にしてください(Firefox3では不要です)。

$ cat 'mousewheel.horizscroll.withcontrolkey.action = 3;
mousewheel.horizscroll.withcontrolkey.numlines = 1; 
mousewheel.horizscroll.withcontrolkey.sysnumlines = true;
mousewheel.horizscroll.withnokey.action = 0;
mousewheel.horizscroll.withnokey.numlines = 1;
mousewheel.horizscroll.withnokey.sysnumlines = true;
mousewheel.horizscroll.withshiftkey.action = 1;
mousewheel.horizscroll.withshiftkey.numlines = 1;
mousewheel.horizscroll.withshiftkey.sysnumlines = true;' >> ~/.m

祝儀敷き
現在の家屋等では通常、この敷きかたをする。4枚の畳の角が一か所に集まらないようにする。
長方形でも縦横の長さによってはこの敷き方は不可能。7:10の35畳敷が不可能な最小の例。
不祝儀敷き
葬儀など縁起の悪いときに、祝儀敷きに対応する作法として敷き換えを行った。よって、お寺や大広間のような広い空間に、最初から並べる敷き方とは意味が違う。
畳の敷きかたの例。ただし辺の長さが1:2の場合のみ成立する

Visual C++ あれこれ

■ ライブラリをリンクする

ライブラリをリンクするには、いくつか方法があるので好きなやり方でどうぞ。

1.「プロジェクト」→「設定」→「リンク」→オブジェクト/ライブラリモジュールに
  リンクするライブラリ名を書き込む。
2.「ワークスペース」→「File View」→「ファイルをプロジェクトへ追加」
  で、ファイルを種類をライブラリにして、ライブラリファイルを選択する。
3.#pragmaで行う。

 


■ 「プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました」エラーを直す

プロジェクトにファイルを追加したときに見られるこのエラー。
このエラーは、追加したファイルの内容に関係なく表示されます。

これを直すには、「プロジェクト」→「設定」→「C/C++」プリコンパイル済みヘッダーにて
プリコンパイル済みヘッダーを使用しない、を選ぶ。

あるいは、以下のようにエラーの出るファイルで"stdafx.h"をインクルードする。


■ 作ったプログラムを他のPCで実行する

作成したプログラムがMFCを使用している場合には、mfc42.dll msvcrt.dllがインストールされていないと実行できません。
(デバッグバージョンの場合にはmfc42d.dll msvcrtd.dll)
したがってプログラムを配布する場合には、上記のDLLも一緒に配布する必要がある。

あるいは、DLLをスタティックにリンクする方法もある。
スタティックにリンクするには
「プロジェクト」→「設定」→「一般」MFCのスタティックライブラリを使用を選択する。
ただし、共有DLLを使用しないので実行ファイルのサイズは大きくなる。


■ 呼び出しているDLLを確認する


EXE,DLLが呼び出しているDLLは、VC付属の「Dumpbin.exe」で確認できる。
場所は、VC++のインストールディレクトリの「Microsoft Visual Stdio\VC98\Bin」です。

使用方法は、コマンドラインから、
dumpbin /IMPORTS ファイル名

と打ち込みます。

インポートしている、DLL,関数が表示されます。

ちなみに、DLLに対して

dumpbin /EXPORTS ファイル名.DLL
でエクスポートしている関数表示もできます。

これらは、Visual Stdio付属ツールのDependency Walkerでも確認できます。

ソースが全然洗われない迷走ブログ » libcURLのVisual Studioでのビルドのメモ

■libcURL

◆公式

◆ライセンス
MITベースらしい。
docs¥LICENSE-MIXINGには、内部で使用するKRB4が、オリジナルBSDスタイルライセンスだから、KRB4を有効にしてGPLのソフトとリンクさせて配布しないで、みたいなこと書いてる。
誤訳だったらゴメン。

■Visual Studio 2005でビルド

 doc¥INSTALLの記述にちょっとウソがあるっぽい。

以下、Visual Studio 2005 standardでビルドしてみて最終的にビルドが通った手順。

1.コマンドプロンプトを開く。

ソースをダウンロードして、解凍。
コマンドプロンプトを開いて、そのディレクトリに移動。

2.vcvarsall.bat実行
ウチのVS2005Standardの環境では以下のような感じ。
"Path¥to¥Microsoft Visual Studio¥VC¥vcvarsall.bat"

3.OpenSSLのパスを環境変数に指定
SSL通信をOpenSSLにさせるときは、ビルド前にOpenSSLへのパスを、環境変数[OPENSSL_PATH]に設定してあげる。
※このとき指定するパスは、インストール先のトップディレクトリではなく、ビルド環境のトップディレクトリである必要があるみたい
何故かはわかんない。

set OPENSSL_PATH=Path¥to¥OpenSSL


4.Makefile修正
libcURLトップディレクトリにあるMakefileを開き、VC=vc6の部分を、対象のVCバージョンに設定してやる。

VC=vc8


5.lib¥Makefile.vcX修正
lib にあるMakefile.vcX(Xはバージョン番号、自分はvc8)を開き、以下の部分を修正。

HTTP以外の通信が必要ないときは、フラグを追加。
他のフラグについては、docs¥INSTALLを参照してください。

CFLAGS = ~ /DHTTP_ONLY ←追加


ビルド対象ファイル追加。
そのままDLLビルドすると、リンクエラーが発生する。
エラー対象関数の実装があるCファイルをビルド対象に追加することで、ビルドが通る。

X_OBJS= ~
$(DIROBJ)¥nonblock.obj ¥ ←行追加


6.ビルド
docs¥INSTALLにはOpenSSLのDLLとリンクするDLL出力は 'nmake vc-ssl-dll' って書いてるみたいなんだけど、多分間違い。
上記だと、スタティックライブラリファイルのみが出力された。

nmake vc-dll-ssl-dll

インクルードパスとライブラリパスにOpenSSLのパスを追加するのも忘れずに。
ビルドが正常に終了すると、以下のファイルが lib に出力される。
libcurl.dll
libcurl_imp.lib
libcurl_imp.exp


7.実行してみる
残念ながら、VC環境ではmake testのようなことはできないみたい。
見つけられなかっただけかもしれないけど。

とりあえずの動作確認に、docs¥examples¥simple.cあたりを実行した。

どこでGETの結果を見るんだろうとか思いながら、何も考えずに実行したら、標準出力にHTMLが出力された。
どうやらHTTPは正しく動いてるみたい。

cURL と libcurl を使ってインターネット経由でやりとりする

C ベースの HTTP クライアント

C の API には、libcurl の機能に関する API が 2 つ用意されています。easy インターフェースは同期型の単純な API です (つまり、あるリクエストで libcurl を呼び出すと、リクエストは libcurl の処理が完了するまで、あるいはエラーが発生するまで待ってから処理を続けます)。マルチ・インターフェースは libcurl を詳細に制御できるため、アプリケーションは複数の転送を同時に実行することができ、またいつどこで libcurl がデータを転送すればよいかを制御することができます。

この例では easy インターフェースを使います。この API でも (コールバックを使うことで) データの転送プロセスを多少制御することができますが、easy という名前のとおり容易に行うことができます。リスト 3 は C 言語による HTTP の例です。


リスト 3. libcurl の easy インターフェースを使った C による HTTP クライアント
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

#define MAX_BUF        65536

char wr_buf[MAX_BUF+1];
int  wr_index;

/*
 * Write data callback function (called within the context of 
 * curl_easy_perform.
 */
size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp )
{
  int segsize = size * nmemb;

  /* Check to see if this data exceeds the size of our buffer. If so, 
   * set the user-defined context value and return 0 to indicate a
   * problem to curl.
   */
  if ( wr_index + segsize > MAX_BUF ) {
    *(int *)userp = 1;
    return 0;
  }

  /* Copy the data from the curl buffer into our buffer */
  memcpy( (void *)&wr_buf[wr_index], buffer, (size_t)segsize );

  /* Update the write index */
  wr_index += segsize;

  /* Null terminate the buffer */
  wr_buf[wr_index] = 0;

  /* Return the number of bytes received, indicating to curl that all is okay */
  return segsize;
}


/*
 * Simple curl application to read the index.html file from a Web site.
 */
int main( void )
{
  CURL *curl;
  CURLcode ret;
  int  wr_error;

  wr_error = 0;
  wr_index = 0;

  /* First step, init curl */
  curl = curl_easy_init();
  if (!curl) {
    printf("couldn't init curl\n");
    return 0;
  }

  /* Tell curl the URL of the file we're going to retrieve */
  curl_easy_setopt( curl, CURLOPT_URL, "www.exampledomain.com" );

  /* Tell curl that we'll receive data to the function write_data, and
   * also provide it with a context pointer for our error return.
   */
  curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&wr_error );
  curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data );

  /* Allow curl to perform the action */
  ret = curl_easy_perform( curl );

  printf( "ret = %d (write_error = %d)\n", ret, wr_error );

  /* Emit the page if curl indicates that no errors occurred */
  if ( ret == 0 ) printf( "%s\n", wr_buf );

  curl_easy_cleanup( curl );

  return 0;
}

リストでは、まず先頭に、cURL のルート・ファイルなど、必要な include ファイルがあります。次に、転送のための変数をいくつか定義しています。最初の wr_buf は受信されるデータが書き込まれるバッファーを表します。wr_index はバッファーに対する現在の書き込みインデックスを表します。

下に下がると、main 関数では easy API を使ってセットアップを行っています。cURL の呼び出しはすべて、個別のリクエストに対する状態を管理するハンドルによって行われます。これは CURL ポインターの参照として定義されています。またこの例では、CURLcode という特別なリターン・コードを作成しています。どの libcurl 関数を使用するよりも前に、curl_easy_init を呼び出して CURL ハンドルを取得する必要があります。次に、いくつかの curl_easy_setopt 呼び出しがあることに注目してください。これらを呼び出すことによって、個別の操作に対するハンドルを構成します。これらを呼び出す場合には、ハンドル、コマンド、そしてオプションを指定します。この例ではまず、CURLOPT_URL を使用して取得対象の URL を指定しています。次に、CURL_WRITEDATA を使用してコンテキスト変数 (この場合には内部書き込みエラー変数) を指定しています。最後に、CURLOPT_WRITEFUNCTION を使用して、データが受信された時に呼び出す必要がある関数を指定しています。この API はこの関数を 1 回呼び出すことになるか、あるいはこの関数の実行を開始した後に読み取ったデータを引数として何度も呼び出すことになります。

転送を開始するためには curl_easy_perform を呼び出します。この関数の役割は、この関数が呼び出される前の構成に従って転送を実行することです。この関数を呼び出すと、転送が完了するかエラーが発生するまでこの関数からは戻りません。main で最後に行う処理は、リターン・ステータスを出力し、読み取ったページを出力し、そして最後に (ハンドルを使い終わったら) curl_easy_cleanup を使ってクリーンアップを行います。

今度は write_data 関数を見てみましょう。この関数は、特定の操作に対してデータが受信されると呼び出されるコールバック関数です。Web サイトからデータを読み取っている間に、write_data によってデータが書き込まれることに注意してください。このコールバック関数は引数として、(受信されたデータを含む) バッファー、メンバーの数とサイズ (この積はバッファーの中のデータの合計です)、そしてコンテキスト・ポインターを取ります。最初のタスクは、バッファー (wr_buf) にデータを書き込むための十分なスペースがあるかどうかを確認することです。十分なスペースがない場合には、コンテキスト・ポインターを設定してゼロを返し、問題があったことを知らせます。それ以外の場合には、cURL のバッファーからデータ書き込み用のバッファーにデータをコピーし、インデックスをインクリメントして次にデータを書き込む場所に設定します。またこの例では、後で printf を使って出力できるように文字列の終端の処理も行っています。最後に、操作対象となったバイト数を libcurl に返しています。バイト数を返すことによって、データが取り込まれたことを libcurl に伝え、libcurl はそのデータを破棄します。たったこれだけです。Web サイトからファイルを読み取ってメモリーに入れる方法としては比較的単純です。


Python ベースの HTTP クライアント

このセクションでは、C ベースの HTTP クライアントに似た例を Python で作成します。Python はオブジェクト指向の便利なスクリプト言語であり、本番ソフトウェアのプロトタイピングや構築に最適です。この例では、ある程度 Python を理解していることを前提にしますが、ほとんど Python の知識を使わないので、それほど深く理解している必要はありません。

Python で pycurl を使った簡単な HTTP クライアントをリスト 4 に示します。


リスト 4. Python で libcurl の pycurl インターフェースを使った簡単な HTTP クライアント
import sys
import pycurl

wr_buf = ''

def write_data( buf ):
        global wr_buf
        wr_buf += buf

def main():
        c = pycurl.Curl()
        c.setopt( pycurl.URL, 'http://www.exampledomain.com' )
        c.setopt( pycurl.WRITEFUNCTION, write_data )

        c.perform()

        c.close()

main()
sys.stdout.write(wr_buf)

Python によるプロトタイピング

この例はプロトタイピングに関する Python の強みの 1 つを示しています。この例ではほとんどコードを使わずに、かなりの機能を実現しています。C の例の方がパフォーマンスは高いかもしれませんが、概念を実証するために素早くコードを作成することが目標である場合には、Python のような高級スクリプト言語に勝るものはありません。

この例は C のバージョンよりもはるかに単純です。まず、必要なモジュールをインポートします (標準的なシステム・モジュールの syspycurl モジュール)。次に、書き込みバッファー (wr_buf) を定義します。C プログラムの場合と同様、write_data 関数を定義しています。この関数が引数を 1 つ取ることに注意してください (HTTP サーバーから読み取られたデータ・バッファー)。ここでは単純に、このバッファーをグローバルな書き込みバッファーに連結しています。main 関数では最初に Curl ハンドルを作成し、次に setopt メソッドを使ってトランザクション用の URLWRITEFUNCTIONを定義しています。そして perform メソッドを呼び出して転送を開始し、最後にハンドルを閉じています。このリストの最後では、main 関数を呼び出し、書き込みバッファーを stdout に出力しています。この場合はエラー・コンテキストのポインターが必要ないことに注意してください。これは、Python のストリング連結を使っており、静的に大きさが決められたストリングを使わないためです。


int型からString型へのキャス

文責:遠藤 理平 (2009年4月 2日) カテゴリ:TIPS 集(9)
#include <stdio.h>#include <string>#include <iostream>using namespace std;int main(){        //次の2ステップで変換する        // ① int 型から char 型への変換        int t= 10;        char t_char[10];        //sprintf(t_char, "%d", t);        sprintf_s(t_char, "%d", t);        printf(t_char);                // ② char 型から string 型への変換        string t_string = "";        t_string +=  t_char;        cout << t_string << endl;}

「sprintf」を使用すると次のようなwarningが出るので、「sprintf_s」を使う
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

【C++】数値型から文字列へ型変換、または文字列から数値型へ型変換する。【boost】

【C++】数値型から文字列へ型変換、または文字列から数値型へ型変換する。【boost】

C++ boostライブラリ キャスト 型変換 数値 文字列 string STL

Javaでは簡単に出来てしまう数値から文字列への型変換ですが、C++の場合だと結鴻<塔hクサイです。
C++の場合は、charにsprintfしてからstringに変換しなければなりません。これって二度手間ですね。
なので、ここでは簡単に変換する方法を解説したいと思います。

ここで利用するライブラリは、今となってはSTLのごとくほぼ標準ともいえるほど知名度も上昇したBoostライブラリです。
では早速やり方から説明します。

ライブラリへのパスは通っているものとして話を進めます。

数値から文字列へ変換。

double d = 1234.56; 上記のようなdouble型の変数dがあったとします。 これを文字列へ変換するには以下のようにします。 string str = lexical_cast<string>(d); 簡単でしょ。 これで変数strの中には "1234.56" という文字列が入ってきます。

文字列から数値へ変換。

次は、逆を行ってみましょう。 string str = "12345"; 上記のようなstring型の変数strがあったとします。 これを数値へ変換するには以下のようにします。 double d = lexical_cast<double>(str); これも簡単ですね。 これで変数dの中には 12345 という数値が入ってきます。

C++文字列 - C++のstring型について調べるも…

/* とりあえず */ Alive and Well

覚えきれないことだって、いつでも調べられさえすればいいんじゃない?

C++文字列


C++のstring型について調べるも…
HP-UXのaCCで使えないので活用できない資料群。

編集

C++ 文字列

編集

文字列

文字列にはC言語の文字列charと、C++で定義されているstringクラスがある。

char型文字列は配列と同じ性質を持つ。文字定数のラベルは文字列のアドレスとなり、関数の引数にはポインタを使用する。

例:

#include <stdio.h>
#include <string.h>

out(char *p){
   printf("%s\n",p);
}

main(){
   char *a="JSA";
   out(a);
}

stringクラスを使用する場合は

#include <string>

を指定する。ラベルはオブジェクトであるからchar型のようにポインタに注意する必要がない。

例1:

/*
cc -lstdc++ b.cpp
*/
#include <iostream>
#include <string>

out(string p){
   cout << p << endl;
}

main(){
   string a="JSA";
   out(a);
}

例2:'+'などの演算子が使用できる。

/*
cc -lstdc++ e.cpp
*/

#include <iostream>
#include <string>
using namespace std;

main(){ 
   string s,s1,s2;

   s="文字列";
   cout << s << endl;
   s1="abc";
   cout << s1 << endl;
   s2=s+s1;
   cout << s2 << endl;
}
編集

初期化

文字列の初期化

string s;          //空文字列
string s="";       //空文字列
string s(5, 'x');  // "xxxxx"
string s="hello";  // hello
string s1=s;       // 代入
string s1(s,1,3);  // 部分代入 s[1]とs[3]
string s1(s+1,3);  // 部分代入 s[1]からs[3]まで
編集

文字列長

文字列の長さを返す。size(), length()は同じ。

例:

string s="日本麻酔学会";
cout << s.size() << endl;  // 12を返す。
編集

文字操作

文字列の要素は配列の様に指定できる。

string s;
char c;
s="abc";
c=s[0];       // 'a'が代入される。
s.at(2)='d';  // 'adc'となる。
編集

結合

+演算子で文字列の結合ができる。

string s1,s2,s3;
s1="abc";
編集

C文字列へ

string型からC言語文字列に変換する。

string s="abcd"
s.c_str();
編集

検索

文字列の検索
日本語(euc)全角文字は2バイトで計算される。

例:

/*
cc -lstdc++ a.cpp
*/

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

main(){

//           0123456
   string s="accdcde";
   cout << s.find("cd") << endl;              // 2が返る
   cout << s.rfind("cd") << endl;             // 4が返る
   cout << s.find_first_of("cd") << endl;     // 1が返る
   cout << s.find_last_of("cd") << endl;      // 5が返る
   cout << s.find_first_not_of("cd") << endl; // 0が返る
   cout << s.find_last_not_of("cd") << endl;  // 6が返る

}
編集

サンプルプログラム

編集

その1

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;
 
void out(string p){
   const char *p2=p.c_str();
   printf("test='%s'\n",p2);
}

void make(string *a){
   char MSG[512];
   sprintf(MSG,"テストです。\n");
   *a = *a + MSG;
   sprintf(MSG,"次の行%d\n",__LINE__);
   *a = *a + MSG;
}

void main(){
   string a="ABC";
   make(&a);
   out(a);
}
編集

その2

//-------------------------------------------
//    string 型使用法いろいろ (ただのメモ) 
//-------------------------------------------

#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

//テスト用メインプログラム
int main(){

   string str;
   char chr[256]="chardata";

   //char型配列からstring型へ変換(1)
   cout << "char型配列からstring型へ変換(1)" << endl;
   str = chr;
   cout << str << endl;
   cout << " " << endl;

   //string型への文字列代入
   cout << "string型への文字列代入" << endl;
   str = "test!";
   cout << str << endl;
   cout << " " << endl;

   //文字列の足し算
   cout << "文字列の足し算" << endl;
   str += "test2!";
   cout << str << endl;
   cout << " " << endl;

   //char型配列からstring型へ変換(2)
   cout << "char型配列からstring型へ変換(2)" << endl;
   str = string(chr);
   cout << str << endl;
   cout << " " << endl;

   //string型からchar型配列へ
   cout << "string型からchar型配列へ" << endl;
   str = "string2char";
    strcpy(chr,str.c_str());
   cout << chr << endl;
   cout << " " << endl;

   //string型からdouble型へ
   cout << "string型からdouble型へ" << endl;
   str = "-123.45";
   double dbl;
   dbl = atof(str.c_str());
   cout << dbl << endl;
   cout << " " << endl;

   //string型からint型へ
   cout << "string型からint型へ" << endl;
   str = "123";
   int it;
   it = atoi(str.c_str());
   cout << it << endl;
   cout << " " << endl;

   //数字をstring型に
   cout << "数字をstring型に" << endl;
   double dbl2 = 246.8;
   sprintf(chr,"%f",dbl2);
   str = string(chr);
   cout << str << endl;
   cout << str[2] << endl;             //stringの3文字目
   cout << str.find(".")+1 << endl;  //"."は何番目?
   cout << " " << endl;

   return 0;
}

ナビゲーション

プロフィール

Photo ほんだら  My status

自分に正直に、目指す物を目指すかたちで、全ての人が幸せになれるシステムを削り出す職人でありたい。

Twitter

follow me on Twitter
Powered by
HndWiki 005754