wafuの技術

技術習得の努力メモです。

Rubyの配列

Rubyで配列を扱います。

■配列の作り方
a = Array.new
a = Array.new(5)  5個のnil
a = Array.new(5,0) 5個の0

lang = %w(Ruby Python C++)
lang = %i(“Ruby”,”Perl”,”Python”)

■文字列のsplitメソッドを使う
a = “This is a Ruby
b = a.split(‘,’)

■要素の置換
a[n] = 200

■2次元配列の作成
a = Array.new(3){Array.new(3,0)}

■主なメソッド
a.unshit(値) 配列の先頭に要素を追加
a.push(値)配列の末尾に要素を追加
a<<値 配列の末尾に要素を追加

1. concat(b配列) aの配列にb配列を追加
a+b 配列を結合する

a[n] = 値 配列の部分置換
a[n..m] = 値 配列の部分置換
a[n.len] = 値 配列の部分置換

a.compact 配列からnilを除く
a.delete(x) 配列から要素xを除く
a.delete_at(n) 配列の位置の要素を除く

今日はここまで

Rubyのメモ(編集中)

Rubyのメモですが、おかしい気がします。

Rubyのコメント

■1行のコメント
#a = 1

■まとまったコメント
=begin
コメントアウトされた内容
=end

■変数の種類
・ローカル変数
 通常使用する変数、小文字から始まる
グローバル変数
 $で始まる
インスタンス変数
 @から始まる
・定数
 大文字から始まる


$! もっとも近い例外
$〜 最後のパターンマッチに関するデータ
$& 最後のパターンマッチした文字列
$. 最後に読んだファイルの行番号
$< コマンドライン引数や標準入力の仮想ハンドル
$> 標準出力

■組み込みメソッド
・chop 最後の文字を取り除く
・chomp 最後の改行を取り除く
・exec(str) 文字列のコマンドを実行する
・fork() プロセスのフォーク
・gets
・sub()

Realforce修理(追記)

最初に疑問 Realfoceのキーが次第に重くなっていると感じるのは私だけ?

 

以前にも書きましたが、Realforceのキータッチが重くなった気がしています。

 

おそらく、経年劣化でラバーカップが硬化したようです。

どこかのサイトでHHKBの対処法で行っているのが、

「ラバープロテクタント」を使用した軟化処理です。

 

これは、10年前に使ってラバー部分が伸びた気がします。

 

どうせ固いのでいいやと「ラバープロテクタント」950円ぐらいです。

試してみました。

軽くなりましたが、まだまだです。

分解大変なのですが、もう一度やり直します。

今度は、まんべんなく行います。

 

どこかのサイトに吸っていくとあったので、ゆっくり吸わせます。

確かに吸っているようになくなります。

 

伸びたゴムが邪魔して蓋が閉まらない。(写真はなし・・)

伸びて収まりが悪そうなところは、あっさり、ゴムをはさみで切ります。

(切るのは、カップの部分ではなく、うすいところです。)

 

うまく入りました。

多少、キーの部分で重さが異なっている気もしますが、

軽くなりました。これです。

 

■効果

修復したRealforceはカタカタ感が戻りました。

軽いです。

安物キーボードにはない感覚です。

今後は安物キーボードを使い回そうと思いましたが、感覚が全然違います。

でもやらないほうがいい

 

■疑問

Realforceは経年劣化でキーが重たくなる?

・ラバープロテクタントで、キーは柔らかくなる。

Realforceの寿命は6年ぐらい?

 

・2024年3月、RealforceのR3を購入しました。

 これです。買い換えをおすすめします。

 やっぱりRealforceは最高です。

Rubyでfiddle(2) オリジナルのDLLを使う

Rubyのfiddleを使って、DLLを使ってみました。

思わぬところではまりました。

 

最初にC++でメインとDLLを作り確認しました。

そのDLLをRubyで呼び出しましたが、エラーになります。

 

・エラー内容1

in `import_function': cannot find the function: dllfunc() (Fiddle::DLError)

これは、関数が発見できないようです。

dumpbin /exports dlltest.dll

・・・・

        1    0 00001000 ?dllfunc@@YAHH@Z

・・・・

原因はわかりません。

C言語では、DLLの呼び出しに問題がありません。

結論は、

__declspec(dllexport) int dllfunc(int);

では、だめで、

/extern "C" {
    __declspec(dllexport) int __stdcall dllfunc (int a);
}

と書く必要があったようです。

これは、C++でCの記述方法を指定するようです。

 

・エラー内容2

in `initialize': No such file or directory (Fiddle::DLError)

これは、DLLの場所が発見できなかったものです。

RubyInstaller::Runtime.add_dll_directory("./")

を追加して、DLLの場所を追加することで対応できます。

 

完成品です。

C(C++)で呼び出す場合

■メイン関数

#define UNICODE
#include <windows.h>
#pragma comment(lib,"user32.lib")


extern "C" {
        __declspec(dllexport) int __stdcall dllfunc (int a);
}

BOOL WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{

        dllfunc(100);

        return TRUE;
}

 

■DLL側

#define UNICODE
#include <windows.h>
#pragma comment(lib,"user32.lib")

extern "C" {
        __declspec(dllexport) int __stdcall dllfunc (int a);
}

 

BOOL WINAPI DllMain(HINSTANCE,DWORD,LPVOID)
{
        return TRUE;
}

__declspec(dllexport) int dllfunc(int x)
{
        wchar_t aa[512];
        wsprintf(aa,L"%d",x);

        MessageBox(NULL,aa,L"info",MB_OK);
        return TRUE;
}

 

Rubyで上記のDLL(dlltest.dll)を呼び出す。

Rubyのメイン

require 'fiddle'
require 'fiddle/import'
RubyInstaller::Runtime.add_dll_directory("./")

module Dlltest
    extend Fiddle::Importer
    dlload "./dlltest.dll"
        extern 'int dllfunc(int)'

end

 

require 'pp'

Dlltest::dllfunc(20)

 

VIの使い方 メモ

viの使い方

間違っているかも知れません。

 

■上下左右の移動

h 左

s 下

k 上

l 右

 

■移動

w 一番右へジャンプ

b 一番左へジャンプ

0 行の先頭へジャンプ(^やhomeキー)

$ 行の末尾にジャンプ(Endキー)

 

H 画面の一番上の行にジャンプ

M 画面の中央の行へジャンプ

L 画面の一番下の行にジャンプ

 

gg ファイルの先頭行へジャンプ

G ファイルの末尾行にジャンプ

:<行番号> 行番号に移動

 

{ 段落の先頭へ移動

} 段落の末尾に移動

 

 

 

■スクロール

CTRL + b 一画面上

CTRL + f 一画面下

CTRL + d 半画面上

CTRL + u 半画面下

CTRL + e 1行上

CTRL + y 1行下

 

コピーアンドペースト

V 選択の開始

 

yy、Y カーソルのある行をコピー

p コピーしたものをペースト

dd 行の切り取り

3dd カーソル位置から3行を切り取り

 

■削除

dd カーソルのある行を削除

x 1文字削除

X カーソル位置の前の文字の削除

d 移動キーの操作に従って削除

 

■その他

U 直前の作業を取り消し

ctrl+r リドウ やり直しのやり直し

 

:set number 番号表示

:set visualbell t_vb=   空白だと音が出なくなる?

:set vb t_vb=

:set noerrorbells エラーの時に音が出なくなる?

※visualbellが視覚表示らしい

 

■操作

:e ファイル名  ファイルオープン

:sp 画面横2分割

:vs 画面縦2分割

:e . ファイラーを開く

:sp. ファイラーを分割画面で開く

:vs. ファイラーを縦割り分割画面で開く

m<任意の英字> マーク

’<任意の英字> マークしたところへジャンプ

:m' <任意の英字> マークしたところへ移動

:! <コマンド> コマンドを実行する

 

■編集モード

i カーソルの位置で編集モード

a カーソルの右側で編集モード

o カーソルの下へ1行追加して編集モード

O カーソルの上へ1行追加して編集モード

shift+i 先頭に移動して編集モード

shift+a 行末に移動して編集モード

 

■編集モードの終了、ファイルの保存

ZZ or wq 保存して終了

:q! 保存せずに終了

:q 終了

 

■検索

/<文字列>

n 次へ

N  前へ

f<任意の1文字> その行の文字検索 右方向

F<任意の1文字> その行の文字検索 左方向

 

■置換

r 1文字置換

:s/<置換前の文字列>/<置換後の文字列>

:%s/<置換前の文字列>/<置換後の文字列>/gc

OCRAのエラー 「libgmp-10.dllが見つからないため」

Ruby3で、OCRAで実行ファイルはできました。

しかし、次のエラーです。

 

libgmp-10.dllが見つからないため、コードの実行を続行できません。
プログラムを再インストールすると、この問題が解決する可能性があります。

 

これは、以前の対応と同じです。

 


ocra sample.rb  --dll ruby_builtin_dlls\libgmp-10.dll

 

コマンドの入力が増えると面倒です。

何か設定があるとうれしいのですが・・・・

OCRAがアップデートするとよいのでしょうか。

 

面倒なのでバッチファイルを作ります。

ocras.bat

・中身

ocra %1 --dll ruby_builtin_dlls\libgmp-10.dll

・使用方法

ocras sample.rb

 

 

OCRAのエラー 「fiber.soが見つかりません。」

Ruby3.1で、OCRAを実行すると、エラーが出てきました。

 

■状況

C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/ocra-1.3.11/bin/ocra:1188:in `initialize': No such file or directory @ rb_sysopen - *****/fiber.so (Errno::ENOENT)

 

fiber.soファイルが見つからないようです。

調べましたが、このファイルはRubyディレクトリにありません。

 

■対応

Ruby2.7のディレクトリを確認すると「fiber.so」が見つかりました。

このファイルを、ディレクトリにコピーすると、実行ファイルを作ることができました。

最終的に動作をしましたが、なにか問題もあるかもしれません。

 

そして、次のエラーです。