2025年03月18日

WindowsコマンドラインでのsFTP操作

コマンドプロンプトを開いて
sftp
と入力。Usageが出てくれは使用可能。

PowerShellで
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'と入力
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed
と出てくれは使用可能

使用可能でなければ(管理者のパワーシェルで)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
でインストールできる。

sFTPの場所は
C:\Windows\System32\OpenSSH\sftp.exe    64Bitの場合
C:\Windows\SysWOW64\OpenSSH\sftp.exe   32bitの場合
インストール状態により、System32にはあるがSysWOW64には無いとかがある。
c:\WINDOWS\system32\cmd.exe はSysWOW64を参照するので見つからないが
PowerShell だとC:\WINDOWS\system32\openssh\sftp.exe は見つけることができたり。
なんだかよくわからんけど。

-----
C++Builderで外部のSFTPクライアント(例: Windows標準のOpenSSH sftpコマンド)をC++コード内から起動し、ファイルをアップロード/ダウンロードする方法(Copilot出力より:動作確認はしていない)

#include <vcl.h>
#include <tchar.h>
#include <cstdlib> // For system()
#pragma hdrstop

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // SFTPのコマンドラインを構築
    String command = L"sftp user@hostname <<EOF\n";
    command += L"put C:\\local\\file.txt /remote/path/\n";
    command += L"bye\n";
    command += L"EOF";

    // system関数を使用して実行
    int result = system(command.c_str());
    if (result == 0) {
        ShowMessage(L"ファイルが正常にアップロードされました。");
    } else {
        ShowMessage(L"アップロード中にエラーが発生しました。");
    }
}


posted by すら at 11:53| プログラミングなこと

2025年02月27日

メモリチェッカーツール

Linuxでつかえるメモリチェッカーツール
https://valgrind.org/

インストール
sudoapt-get update
sudoapt-get install valgrind

用途は
メモリチェック(メモリリーク、未初期化メモリの使用、不正メモリアクセスなど)
valgrind --leak-check=full ./your_program
CPUキャッシュの使用状況をプロファイルし、キャッシュミスを分析
valgrind --tool=cachegrind ./your_program
プログラムのコールグラフを生成し、関数呼び出しのパフォーマンスを分析
valgrind --tool=callgrind ./your_program
ヒープメモリの使用状況をプロファイルし、メモリ使用量のピークを特定
valgrind --tool=massif ./your_program
マルチスレッドプログラムのデバッグを行い、データ競合やロックの問題を検出
valgrind --tool=helgrind ./your_program

オプションを付けなければ、メモリ関連の問題を調べる

ほかに。
--log-file=/path/to/logfile.log
を付けると指定下ファイルへログをリアルタイムに落とす
(リアルタイムなので、セグメンテーションフォルトで落ちてもログが残る・・・らしい)


gdbでrunさせるよりは簡単かも。

※gdbの場合
gdb ./your_program
(gdb) run
問題があって止まったら
(gdb) backtrace
コアダンプを使う方法もある。


(Copilot出力より)
posted by すら at 16:17| プログラミングなこと

2025年02月26日

VS code + GitHub Copilot + Vzキーマップ

DOS時代は、FD + Vz Editor
Windowsになってから、WinFD + Wz Editor で頑張ってきました。

CopilotのGitHub版を使いたい→ブラウザかVS Code かあ。
どうやらVzキー配置がVS Vode 用であるようだ→なんだと!?

ということで
VSCodeでGitHub Copilotを使う方法・・・Copilot出力より引用、ここから---------------------

  • GitHubアカウントの作成: まだ持っていない場合、GitHubにアクセスし、無料のアカウントを作成します。

  • Visual Studio Codeのインストール: Visual Studio Code (VSCode)の公式サイトから、最新バージョンをダウンロードしてインストールします。

  • GitHub Copilot拡張機能のインストール:

    • VSCodeを開き、左側の「拡張機能アイコン」をクリックします(四角形に四つの小さい正方形が並んでいるアイコン)。

    • 検索バーに「GitHub Copilot」と入力し、表示されたリストから「GitHub Copilot」拡張機能を選択してインストールします。

    • インストールが完了したら、VSCodeを再起動します。

  • GitHubアカウントでログイン:

    • VSCodeが再起動されたら、GitHub Copilotの設定を行います。画面下部のステータスバーにある「Sign in to GitHub」をクリックして、GitHubアカウントにログインします。

    • ブラウザが開き、GitHubへのログインを促されますので、認証を完了させます。

  • GitHub Copilotの有効化:

    • ログインが完了すると、VSCode内でGitHub Copilotが有効化されます。設定メニューからGitHub Copilotのオプションを確認し、必要に応じてカスタマイズします。

-----------------ここまで

なおVz KeyMapは、拡張機能のインストールでVz Keymap と入力したら表示されるので選択してインストール。

さて、どうでしょう?

2025.02.27追記
VS CodeのVzキーマップはファンクションキーが再定義されないので使うのをやめました。
CopilotのGitHub版は強力で、チェックライトの為printfを書こうとすると自動生成してくれる。ほかにも繰り返し処理を書くときにも自動生成してくれて・・・これはええぞ(^^)
posted by すら at 10:47| プログラミングなこと

2024年12月02日

C++ の 0除算 などなど。

C++において
・整数演算の0除算→例外が発生する。
・浮動小数点の0除算→NaN(Not a Number)を返す。

NaNの検出
以下、double value; において。

その1)std::isnanを使う
#include <cmath>
if( std::isnan( value ) == true ) printf("NaNである");

その2)NaN は比較で自分自身と等しくないことを利用する
if( value != value ) printf("NaNである");

※NaNは(自分自身との比較を含む)すべての比較は常にFalseになるようだ。
posted by すら at 15:36| プログラミングなこと

2024年09月27日

C++Builder で指定URLを表示する

以下のようにする。

    ShellExecute(this->Handle,L"open",L"http://(表示したいアドレス)",NULL,NULL,SW_SHOW );
posted by すら at 11:55| プログラミングなこと

2024年05月22日

std::shared_ptr や std::unique_ptr で確保した領域の解放

共にデストラクタで自動的に開放する。が reset() で手動で解放もできる。

std::shared_ptr<int> my_shared_ptr = std::make_shared<int>(0);
my_shared_ptr.reset();

std::unique_ptr<int> my_unique_ptr = std::make_unique<int>(0);
my_unique_ptr.reset();


posted by すら at 17:02| プログラミングなこと

2024年05月21日

C++で関数名を渡したい

void function1( int a,double b ){ ... };

これを関数名でほか関数に渡したい場合。
std::function<void(int,double)> F1= std::bind( function1, std:placeholders::_1, std::pleaseholders::_2 );
F1(3,3.14);
みたいな感じで。

funciton1 は前で規定した、変数化?したい関数
std::placeholders::_1  F1の第1引数 → function1 の a に入る
std::placeholders::_2  F1の第2引数 → function1 の b に入る
10個くらいは引数付けられるみたいだ。
※引数の代わりに固定値も可、ただしstd:placeholdersを使うなら_1から順に

クラスの自分の中の関数を指定の場合

class aaa{
void function2( int c ){ ... };
void function3( int d ){
  std::function<void(int)> F2= std::bind( function1, this,  std:placeholders::_1 );
  F2(5);
  };
};

クラスで使うなら、std::bindの第2引数にインスタンスを入れる。自分のインスタンスの関数ならthisとなる。
std::function<>の部分はautoにしとくと記載は楽。だが場所を選ぶかも。

C++11から対応です。
続きを読む
posted by すら at 19:01| プログラミングなこと

2022年07月14日

VS code の設定

VS CODEの設定いろいろ(出くわしたときに追記)
・文字コードの自動判別
ファイル→ユーザー設定→設定、でfiles.autoGuessEncoding を検索し、チェックを入れる
posted by すら at 12:05| プログラミングなこと

2021年12月22日

selectで複数のreadやrecvをキャッチする

selectで、例えばrs232Cの受信だったり、TCPの受信だったりをタイムアウト付きでチェックするときの定型として以下のように書くけど。

  int            fd;
    char          buf[];
    int             length;
    int             timeOutMs;
    fd_set        readfds ;
    struct        timeval tv;

    FD_ZERO( &readfds );
    FD_SET( fd, &readfds );
    tv.tv_sec = (int)(timeOutMs / 1000);
    tv.tv_usec = (int)((timeOutMs % 1000) * 1000);

    int  nfds = select( fd + 1, &readfds, NULL, NULL, &tv ) ;
    if( nfds == 0 )                                    // タイムアウト
        return( 0 ) ;

    return  read( fd, buf, length ) ;

これは1つのファイルディスクリプタの受信を待つ場合で。
複数だったらどーする?その分スレッドを立ち上げる?と疑問に思っていたが、
どうやらFD_SETを複数書けば良いみたいだ
    FD_SET( fd, &readfds );
    FD_SET( fd2, &readfds );
としてselect実行のあと、各ファイルディスクリプタに対して
  FD_ISSET( fd, &readfds ) != 0
  FD_ISSET( fd2, &readfds ) != 0
0以外となるもの(受信したファイルディスクリプタ)をそれぞれ調べ、あればreadだったりrecvだったりをぶちかますとよい様子。

注意として。
ファイルディスクリプタは1024個まで、らしい。
そもそも多い時はポーリングにした方が良いようですね。


なお。
Posixのメッセージはファイルディスクリプタではない→この方法が使えない。
Messageはシグナル通知(インターバルタイマーみたいに)することが可能とのこと。
便利なんか不便なんかようわからんな。
posted by すら at 17:47| プログラミングなこと

2020年10月12日

[C++Builder] _beginthreadex にクラス内関数を指定する

重要そうなところは太文字にしてみた。

クラス宣言
class Caaaa
{
private:
    HANDLE   threadHandle;

public:
    unsigned int __stdcall Execute();   // スレッド実体
    static unsigned int __stdcall executeLauncher(void* args);  // スレッドのランチャー
};

スレッドのランチャー
unsigned int __stdcall Caaaa::executeLauncher(void* args)
{
    reinterpret_cast<Caaaa*>(args)->Execute();
    return 0;
}

実際に行いたいスレッド実体
unsigned int __stdcall Caaaa::Execute()
{
    // ここにスレッドの処理をごにょごにょと。

    _endthreadex( 0 );
    return 0;
}

スレッド起動したいところで
    threadHandle= (HANDLE)_beginthreadex(NULL, 0, &Caaaa::executeLauncher, this, 0, NULL);


という感じで動いた(XE2で)
続きを読む
posted by すら at 19:51| プログラミングなこと

2020年10月09日

[C++Builder]C++ではあらゆる宣言に型指定子が必要です。

プロジェクトのオプションで
C++コンパイラで「'従来の'Borlandコンパイラを使う」のチェックを外したら形チェックが厳しくなる模様。
そのため
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
と最初に戻り値intを書かないといけない、などなど。
他にも
char * と unsigned char* は違うものとして扱われる、などなど。
続きを読む
posted by すら at 14:01| プログラミングなこと

2019年01月17日

DirectInput Joysticでエラー:0x80070216

DirectInput をC++Builderで使う場合。
特にJoysticで、Joystick->SetDataFormat(&c_dfDIJoystick)を実行すると 0x80070216 が戻る時。
C++Builderで使うには、Microsoftが供給する dinput.h にいくつか不足があるようです。

http://princess-tiara.biz/directx/

で公開されている、dinputex.h を追加でIncludeするとうまくいきました。
そのほか、DirectXでのエッセンスが多く記載されています。為になりました(^^)

続きを読む
posted by すら at 15:01| プログラミングなこと

2018年04月28日

C++BuilderXE2 リンクエラー

LME288 が出る場合。

ilink32のバグだそうで。
https://stackoverflow.com/questions/28929516/c-builder-xe7-lme288-error
にあるiLink32をダウンロードして差し替えると通る。

[追記]
・・・というのもあるけど。
ファイルエクスプローラーからcbprojファイルをダブルクリックでC++Builderを起動するのではなく、C++Builderをウインドウズメニューから起動、プロジェクトをロードするようにするとリンクエラーが出なくなったりする。
なんのこっちゃ。

posted by すら at 14:16| プログラミングなこと

2015年05月21日

munmap_chunk()エラー

Linux で

*** glibc detected *** (実行ファイル名): munmap_chunk(): invalid pointer: (アドレス) ***

が出た場合。


malloc のポインタと free のポインタが不一致の場合に出るエラーな模様。

C++の場合だと、new を配列指定で行って、delete に配列指定をしなかった場合とかに起こる。

posted by すら at 11:37| プログラミングなこと

2014年07月21日

C++Builderでソースが保存できない場合

C++Builder XE2 において。

プロジェクトのホルダを移動した場合、編集後の保存ができなくなることがある。

この場合はプロジェクト終了後プロジェクトファイルをテキストエディタで開き、元のホルダを記載している部分を新しいホルダに修正することで直る。
posted by すら at 16:46| プログラミングなこと

2014年06月24日

VC++のランタイムのスタティックリンク

VC++で作成したアプリケーションにランタイムを含める場合。
プロジェクトのプロパティ
→「C++」
→「コード生成」
→「ランタイムライブラリ」にDLLが付かないものを指定する。
posted by すら at 12:03| プログラミングなこと

VC++のmath.h

VC++ の math.h について。

floor(), ceil() でエラーが出る場合。
→ stdafx.h をコード先頭でinclude してないのが原因かも。

M_PI 等の定数が使えない
→ math.h のインクルード前に _USE_MATH_DEFINES をdefineする。
posted by すら at 11:58| プログラミングなこと

2014年06月17日

C++BuilderでDLLからlibを作成

implib (Libファイル).lib (DLLファイル).dll
posted by すら at 10:37| プログラミングなこと

2013年10月11日

Lollipopでmysqldump

Lollipopでmysqldumpを使ってバックアップする例

(以下、<>は半角に直すこと)---------------------
<?php
$dbHost = '(ホスト名)';
$dbUser = '(ユーザー名)';
$dbPass = '(パスワード)';
$dbName = '(DB名)';
$fileName = 'DBbackup'.date('ymd').'_'.date('His').'.sql';
$command = "mysqldump --default-character-set=binary --single-transaction --lock-tables " . $dbName." --host=".$dbHost." --user=".$dbUser." --password=".$dbPass." > ".$fileName;
print $command . "<hr>";
passthru($command, $ret);
print $ret . '<hr>';
?>
---------------------

出力が途中で止まっている場合は、SSHで実行してみる。

mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1':

というエラーが出ている場合は
mysqlと、mysqldump のバージョンが異なっている(mysqldumpが5.6より低い)場合。
この場合は、合致するmysqldump が他のパスにあるので、運営に問い合わせること。
posted by すら at 11:53| プログラミングなこと

2013年02月18日

C++Builder 文字列変換

AnsiString から UnicodeString に変換するに当たって、とりあえずの処置方法。

・エラーとなったchar型固定文字列は文字列の前にLをつける。
 例:"AAA" -> L"AAA"
・エラーとなったAnsiStringはAnsiStringな理由がなければそのままUnicodeStringに移植する。
(変数/引数定義部分の書き直し)
・通信文字列等でそのままAnsiStringを使いたい場合は、エラーとなった部分だけUnicodeString()で囲む。


つまり。
UnicodeString(AnsiStringな文字列) ← UnicodeString
AnsiString(UnicodeStringな文字列) ← AnsiString
AnsiString(文字列).c_str() ← char*
UnicodeString(文字列).c_str() ← WCHAR*
というので、基本的にはいける。
posted by すら at 16:41| プログラミングなこと