Top image

Perl Monk

主にPerlとRaspberryPiの個人的技術研鑽


小菅西公園

2024/04/14 16:08
category:日常

ATL

> read more


桜が咲く短い間のお気に入り場所

2024/04/07 19:16
category:日常

ATL


ChatGPTのAPIを使って、Perlでrole処理しながらチャットサイトを作ってみる。

2024/03/26 20:00
category:Perl

通常のWEBでアクセスしてチャットするみたいなのをAPIつかって自前で作成してみました。

ATL

そんなの普通に使えば必要ないじゃんって事ですが、複数人数で利用する場合一つのアカウントを使いまわすことは規約的にNGなので、社内用に作ってみました。

そこからシンプルな形に一部削って掲載してます。

GPT4をAPIで叩くには、一度課金が発生しないと使えない場合があるそうなので一旦ガンガン回して課金してから有効にする必要があるかもです。

以下ソースコード。細かい処理は適当です、参考程度に。

> read more


念願の作業場

2024/03/02 16:57
category:日常

レトロな蛍光灯を購入して、中身総取り換えして動作テストをしている最中の図。

ATL

作業部屋をもつのが夢ではあったが、そんな広い所には住めないと諦めていました。

ちょっとした場所に作業台つくって照明置いたら作業場になるんじゃと思い、こんな感じになりました。

モノ作りが捗ってすごく良いです。


月の初めからカウントして、指定した日が第何の何曜日か計算するサブルーチン

2023/06/27 21:00
category:Perl

もっといい方法があると思うんだけど、何回その週が現れたかカウントアップしているだけです。

サブルーチンの引数をチェックする部分は考慮していません。

ChatGPTで色々学習させて作らせてみたけど、どうにもちゃんと動くものがなぜか出来なかったので仕方なく・・・。

#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;
my $year = 2023;
my $mon = 6;
my $day = 21;
my @days_of_week = qw(日 月 火 水 木 金 土);
my ($week_count,$week_no) = week_count($year,$mon,$day);
if ( defined $week_count and defined $week_no ) {
	print "$year年$mon月$day日は、第$week_count $days_of_week[$week_no]曜日です\n";
}
sub week_count {
	my ($year,$mon,$day) = @_;
	my $week_count;
	my $week_no;
	for ( my $i = 1 ; $i <= $day ; $i++ ) {
		my $time = timelocal(0,0,0,$i,$mon-1,$year-1900);
		my $week = (localtime($time))[6];
		$week_count->[$week]++;
		if ( $i == $day ) {
			$week_count = $week_count->[$week];
			$week_no = $week;
			last;
		}
	}
	return($week_count,$week_no);
}

■実行結果

2023年6月21日は、第3 水曜日です


工業エリアから眺めるこの都心が好き

2023/06/02 20:08
category:日常

ATL


ChatGPTのAPIをPerlで叩く方法

2023/04/09 10:00
category:Perl

ChatGPTに直接聞いてみたら、なんか古い方法しかでてこなかったので。

適当にやったんで細かいところは確認してないです。

あと他にパラメータがある様子なんですが、ちょっといじっても変化がよくわからなかったので省きました。

言語モデルはgpt-3.5-turboパターンです。

LWP::UserAgentとlwp::protocol::httpsが必要ですがそこらへんは割愛します。

会話を続けるには、やり取りの経緯をroleをつかって全て入力する必要があります。

面白いので、またちまちま何かしてみようかと思います。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use JSON;
use Encode;
use utf8;
my $API_KEY = "取得したAPIキー";
my $input = "こんにちは、あなたは誰ですか。";
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(
 POST => 'https://api.openai.com/v1/chat/completions'
);
$req->header('Content-Type' => 'application/json');
$req->header('Authorization' => 'Bearer ' . $API_KEY);
my %post_data = (
	"model" => "gpt-3.5-turbo",
	"messages" => [
		{
			"role" => "user",
			"content" => $input,
		}
	],
);
$req->content(encode_json(\%post_data));
my $resp = $ua->request($req);
if ($resp->is_success) {
    my $resp_data = decode_json($resp->decoded_content);
	print Encode::encode('utf-8',$resp_data->{choices}->[0]->{message}->{content}."\n");
    my $tokens = $resp_data->{usage}->{total_tokens};
    print Encode::encode('utf-8',"使用トークン数:".$tokens."\n");
} else {
    die $resp->status_line;
}

実行結果)

こんにちは、私はOpenAIのAIアシスタントです。どうぞ何でもおっしゃってください。

使用トークン数:48


流行りのChatGPTにPerlを質問してみた

2023/02/16 20:00
category:Perl

こんなんすごすぎやろ・・・・!!

ノウハウ系のブログなんて一瞬で死んでもう。

■Q

Perl言語の将来性は?

■A

Perlは、広く使用されているスクリプト言語の1つであり、特にWeb開発やデータ処理、自然言語処理などの分野で人気があります。しかし、近年は、Python、JavaScript、Rubyなどの他の言語が、Perlよりも人気がある傾向があります。そのため、Perlの将来性については、慎重に見る必要があります。

一方、Perlのコミュニティは非常に活発であり、Perl 5とPerl 6の両方のバージョンが開発されています。また、Perlの柔軟性と拡張性は、特に大規模なシステムやネットワークの管理に適しているため、特定の分野で依然として人気があります。

総じて、Perlの将来性については、他の言語との競合によって影響を受ける可能性がある一方で、Perlコミュニティの熱心なサポートと、特定の分野での高い需要によって、今後も使用され続ける可能性があります。

■Q

unixtimeを相互変換するPerlのコードを教えて

■A

PerlでUnix Timeと日付時刻の相互変換を行う場合、標準モジュールであるTime::Pieceを使用することができます。以下は、Unix Timeを日付時刻に変換するコードと、日付時刻をUnix Timeに変換するコードの例です。

Unix Timeから日付時刻に変換する場合:

use Time::Piece;
my $unix_time = 1613481838;  # 変換したいUnix Time
my $dt = localtime($unix_time);  # Unix TimeをTime::Pieceオブジェクトに変換
my $datetime = $dt->datetime;  # 日付時刻をISO 8601形式の文字列に変換
print "$datetime\n";

日付時刻からUnix Timeに変換する場合:

use Time::Piece;
my $datetime = '2023-02-16T16:30:00';  # 変換したい日付時刻(ISO 8601形式)
my $dt = Time::Piece->strptime($datetime, '%Y-%m-%dT%H:%M:%S');  # 日付時刻をTime::Pieceオブジェクトに変換
my $unix_time = $dt->epoch;  # Unix Timeに変換
print "$unix_time\n";

以上のように、Time::Pieceを使うことで、Unix Timeと日付時刻の相互変換が簡単に行えます。

■Q

Perlのクロージャ―の使い方をおしえて

■A

Perlのクロージャは、関数内で定義されたサブルーチンで、その関数のスコープ内で変数を参照することができます。これにより、関数のスコープ外で変数が変更されることを防止することができます。

以下は、Perlでクロージャを使う方法の例です。

sub make_counter {
    my $count = 0;
    return sub {
        $count++;
        return $count;
    };
}
my $counter = make_counter();
print $counter->(); # 1を出力
print $counter->(); # 2を出力
print $counter->(); # 3を出力

この例では、make_counterという関数が定義されています。この関数は、スカラー変数$countを定義し、その変数を参照するサブルーチンを返します。このサブルーチンは、$countをインクリメントしてから、インクリメントされた値を返します。

make_counterを呼び出すと、サブルーチンが返されます。これを変数$counterに代入します。$counterを呼び出すと、サブルーチンが実行され、$countがインクリメントされた後に値が返されます。クロージャは、make_counter内で定義された変数$countにアクセスできるため、各呼び出しでカウントがインクリメントされます。

このように、クロージャを使用すると、関数のスコープ外で変数を安全に保持できます。


2023

2023/01/02 19:49
category:日常

ATL


Perl小ネタ:サブルーチンの出力と文字列を連携する

2021/12/20 20:00
category:Perl
sub test_print {
	retrun 'test';
}

があったとして。

my $value = 'moji'.&test_print;

とかするとエラーになるので、joinを使って連結します。

my $value = join('','moji',&test_print);
※第一引数は区切り文字になります。区切りは , で行います。

[ page:1 ]
Next Page >