[Perl] 基礎的な事項

2009/06/13Perl::基礎import

[Perl] 簡単な文法メモ

スカラー変数

汎用変数と思えばいいかな. 型定義は特に無い.(値/文字列/リファレンス(ポインタ))

my $hogehoge

初期化しない状態は未定義(undef)となります。値ならゼロ、文字列ならNULL扱いになります。演算時に評価されますが、use warningすると未初期化変数の演算といわれます。undefかどうかの判定は、下記の関数を利用することになります。

defined($hogehoge)

下記の比較演算子は使えません。

$hogehoge == undef $hogehoge eq undef

scope hogehoge;

スコープ'hogehoge'を定義する。

require Exporter;

@ISA, @classname::ISA = @qw(the_class):

SuperClassを定義します. this class IS-A the_class.もしくは、下記のように記述できます。

use the_class;
@thisclass::ISA = qw(the_class);
||>
↓
>||
use base qw(the_class);

配列操作

初期化
@hoge = ('hoge','hogehoge',...);
@hoge = ("hoge","hogehoge",...); ← 展開される
@hoge = qw ( hoge hogehoge ...); ← 展開される. 空白で区切られる.
参照
$hoge[0] # zero-origin
$#hoge   # indexの末尾が得られる
$hoge[-1] <=> $hoge[$#hoge]

ハッシュ操作

宣言

my %hash_name;
初期化
%hash = ( "key1" => value, "key2" => value);
または、一次元配列でkey,valueの順列。
%hash = (key1, value1, key2, value2)
%hash = (); # 空っぽになる. |ハッシュアクセス:
keys %hash # hashの持つキーを配列で取得する.
values %hash # 同, 値を配列で取得する.
exists $hash{'key'}; # そのキーが存在するか. 真/偽を返す. 未初期化と定義済みと判断可能.
delete $hash{key} # 指定したキー/値を削除する.

pack/unpack

syntax:

pack TEMPLATE, LIST
unpack TEMPLATE, LIST

templateの書式を以下に示します。

フォーマット 意味 フォーマット 意味
aASCII 文字列AASCII 文字列、足りない領域はスペース文字で埋める
bビット列 (昇ビット順)Bビット列 (降ビット順)
c符号付き char 値C符号なし char 値
d機種依存の倍精度浮動小数点数f機種依存の単精度浮動小数点数
h16進数文字列 (下位ビットが先)H16進数文字列 (上位ビットが先)
i符号付き int 値I符号なし int 値
l符号付き long 値L符号なし long 値
nネットワークバイト順序 (ビッグエンディアン) の short 値Nネットワークバイト順序 (ビッグエンディアン) の long 値
p文字列へのポインタP構造体 (固定長文字列) へのポインタ
s符号付き short 値S符号なし short 値
vVAXバイト 順序 (リトルエンディアン) の short 値VVAXバイト 順序 (リトルエンディアン) の long 値
uuuencode した文字列xヌル文字
X1バイト後退@絶対位置までヌル文字で埋める
  • フォーマット文字の後ろには、それを何回繰り返すかを示す数字COUNTを付けることができます。\COUNTに * を指定すると、残っているすべての要素を使います。
  • フォーマット文字(COUNTも含める)同士の間にはスペースを挟むことができます。
  • a、A、b、B、h、H以外のフォーマットは、第2引数LISTからCOUNTで指定された分の値を使います。
  • aやAというフォーマットに対してCOUNTを使うと、繰り返し数で示す長さの文字列となるように、\必要に応じてヌル文字かスペース文字を付け足します。
  • unpackするとき、Aは後続のスペース文字やヌル文字を取り除きますが、aはそのままにします。\同様に、bやBは、繰り返し数で示すビット長のビット列にパックします。
  • hやHは、そのニブル長のニブル列にパックします。
  • Pは、指定した長さの構造体へのポインタをパックします。
  • 実数 (floatとdouble) は、機種依存のフォーマットしかありません。\あるマシンで パックした浮動小数点数は、別のマシンでは読めない可能性があります。

split

区切り文字を指定して、stringを分割します。

@list = split(/\t/ , $var); // 区切りはTAB文字となっていることを見る.
@list = split(/[\t]/ , $var); // 区切りはTAB文字となっていることを見る.
 // 複数指定もできるが,区切り文字もリストに放り込まれる.

FileI/O

個人メモだから説明を端折ってもいいかな...\Cの標準関数 fopen/fclose みたいな感じで。出力は">"をつけて表す。

my @binhex;

 if ( ! open(fp, "<".$fname ) ) {
   printf("cannot open \"$fname\" \n");
   die ;
 }
 binmode( fp );
 while( read(fp, $buffer, $size_of_bytes) ){
   @binhex = unpack( "v32", $buffer ) ;        # divide little endian(short) x 32
 }


参考サイト

  • Smart Smartさん\非常にまとまっているサイト。Perl講座、HTML講座、JavaScript講座、SQL講座、注目技術・アクセス講座と幅広く展開されています。困った時は訪れるとよいかと思います。

Perl

2009/06/13Perlimport

[Perl] もくじ

便利なscript言語として、数年ほど前から、開発の補助ツールとしてPerlをかじっているけれども、備忘録を兼ねてメモを置いていくことにしました。

今までお世話になったWEBサイト様も多数ありましたが、自分のほしいものは自分でまとめておくに限りますしね。


環境としては、Windows x86またはx64 / Active Perl 5.10.0あたりを想定します。

ASP kernel 1.3.1-SH7144依存部(CQsh2_gcc)

TOPPERS/ASP kernelのSH7144への移植~その3

日記タイトルとしてはコッチが正解.wiki titleにも生ってしまうので,タイトル名はソレらしいものへ修正.

[TOPPERS/ASP] SH7144向けASP kernel 1.3.1対応ターゲット依存部

表題のモノをリリースいたします.個別パッケージのみのリリースとさせていただきます.

当方ではROM化した環境でのみ確認しております.内蔵RAMだけでの動作も未確認です.
RAM上にコードを置いた場合,微微小時間待ちのチューニングができておりませんので,実時間に対して待ちすぎてしまうことが予想されます.

ターゲット略称CQsh2_gcc
target H/WCQ出版,Interface誌 2006年 6月号付録 SH7144ボード(※1)
ターゲット非依存部asp-1.3.2
他必要な個別リリース物asp_arch_sh12a_gcc-1.3.1.tar.gz(※2)
言語処理系binutils-2.18, GCC 4.3.2, newlib-1.16.0, (gmp-4.2.3, mpfr-2.3.2)

※1ただし,付録基板は以下の改修済みであることを条件とする.

  • DBGMD端子のPullDown
  • SCIF1のレベル変換後のPullUpパターンカット
  • 電源レギュレータ入力コンデンサ増強
  • 外付け高速SRAM/ロジック追加

※2SH1/2Aアーキテクチャ・GCC依存部パッケージ(released at 2008-05-13)


実作業

メモとして不足があるとは思いますが,076077とが対象となります.ご参考まで.

低電圧ヘッドホンアンプ

2008/10/14工作::ampimport

低電圧ヘッドホンアンプ2?(nabeさん設計) with 基板ありがとうございます

nabeの雑記帳にて,40万ヒットのプレゼント(2008-09-17)がありました.
迷わず申し込んで,基板+OPAMPをいただくことができました.ちょっとした郵便自己があってケミコンは破裂*1していましたが(笑)

20081014_opbuf01.JPG

ご覧のとおり,いじくっている最中ではありますが,blogへのコメント期限が近いので,途中経過を報告させていただきます.なお,こちらに書く前に,mixiで少しメモっていたので引用してきますので,文体がいつも以上に酷いです*2


*1 : 郵便局の機械で詰まったらしいです.機械のほうが心配だったよ...

*2 : mixiメモへの自分用リンク:2008年10月09日02:24, 2008年10月14日02:02

結論

現時点では,USBDAC出力をPC側で絞った音のほうが好みです.
ヘッドフォンアンプにより,アナログアッテネータで減衰することで音質の向上が見込めるということですが,しばらくUSBDACの音に惚れていたせいか,未だ馴染めません.

回路定数の修正や,ボリュームの変更で大きく変わるのか微妙ですけれど,低音が強調されすぎの感じがします.もともとこういう音かもしれませんが・・・.


[TRY]foobar2000で音量を下げる

アンプの出力をあげて,USB-DACをヘッドフォン直結で聞いていた音量にしてみました.
これこれ.低音が弱まって聞きなれた音になりました.ということは,PCで音量を下げた弊害で音が変わっていたということか!?

音声データはCDから可逆圧縮でリッピングしたものなのですが,デジタル処理しただけでは情報が変わってしまうというのか.


TRY予定

エミッタ抵抗で音が大きくは変わらないとは思いますが,コレも経験.
推奨値の1Ωに置換して聞いてみます.

本家のコメント85にて,OP-AMP近傍にパスコンがないとの指摘.OSコンから数センチ離れていて,間にトランジスタさんもいるようです.トランジスタが電流をそんなに引っ張らない気もしますが.これもパスコンもしくはバイパス配線してやると向上が期待できるかもしれません.
というか,先に電源ラインに問題があるかを確認すべきですね.
シンクロスコープで見えるか(要観測)



以下,日記形式にて.

実装前

ダイアモンドバッファ部分について,トランジスタの選別が必要と思い込んでいました.部品入着を待っていたり,選別作業に音を上げていたら,コメントが... 一週間近く見落としていました(失礼しました)

もう一度回路を見直すと,ダイアモンドバッファ出力がOP-AMPへと帰っているではありませんか!.帰還してるなら,選別しなくても出力にDCが乗ることもなさそうですし,どうせコンプリメンタリでも歪むのだから,と考えて実装へと移りました.


実装当日

nabe先生のヘッドフォンアンプ基板,選別あきらめて実装しますた.とりあえずバラック状態でエージング開始.ケーシングすれば半田付けしなおすわけで,熱劣化再発生という罠も...レポを一度出してからケース入れすることにしよう.


とりあえず電源入れてすぐは,すごくもやのかかった感じがした.高音がのびず,低音がboostされた感じだ.PC側ボリュームをMAX.にしているせいもあるし,回路定数を在庫で合わせてしまっている(後述)から,差分もあるだろう.

で,しばらく温まってきたせいか,耳が慣れてきたせいか,もやが少しマシになる.というか,もともとエコーがかかっていて,ソレが強調された感じだった,かな..注力して効いてしまうと,耳のフィルタのせいで感じも変わるから難しいねぇ.

低音が増してるのは間違いないな... 長時間使うと疲れそうだ.しばらく放置して様子を見るか.入力短絡しておいたほうがいいんだろうな.

エミッタ抵抗は手持ち在庫の都合で4.7Ωを実装.
CRDは1mAを使用.
電池はeneloop単3で初期充電のものを使用.

エージング三日ほど

ヘッドフォンアンプ,三日三晩くらいは放置したので,エージングは十分なはずなのだが,高音が伸びない.
良く考えたら,以下のことがあげられる.

  • eneloopは初期充電のものを使っている
  • 出力段の抵抗が定数違いである
  • ボリュームが推奨品ではない*3

抵抗は明日にでも入着する*4ようなので,電池を疑ってみた.

寝る前にするんじゃなかったwwww

電池交換後

アルカリの中古電池があったので,コレを使用.新品過ぎると少し電圧が心配だった.とはいえ,アンプとOSCONの耐圧が2.5Vというのに引っかからなければいいので,1.5+αであれば耐えられたとは思う.設計は1.2Vなので,コレで比較しなければならないわけだが.# 充電器が見つからない.結構片づけが進んでいるはずなのに.チェックする前にしまったか.

電源電圧向上により,高音の伸びが復活.低音は相変わらずboostされている.解像度はUSBDAC並みに上がったと思われる.注意深く効くようになって,耳がエージングされて*5しまっているところもあるので,比較時には聞き込んだものか,初めて聞くもので比較すべきだろうか.

現在の評価楽曲

現状,水樹奈々嬢のSecret Ambitionと Heart-Shaped Chantとを使用.前者はハイハット,後者は弦楽器(ハープみたいなやつ)がどこまで聞こえるか,で,解像度の良し悪しを判断している.他の音に混じって聞こえてこなかったのが,聞き分けられるようになってきた.耳がなじんだせいもあるから,これだけで評価してはいけないということだなw

特にレコーディングされたものは,vocalのブレスを殆ど意図的に消してしまっていて,それが楽曲に紛れて消えるかどうか,とか,息遣いが判るか,なども判断材料にしたかった.その点,同人CDはブレス消してないのもそこそこあるようなので,狙ってみるといいかもしれない.

電子楽器が多いのはちょっと耳が痛い.低音boostされたものを聞いても,疲れる.寝る前だからか?w


寝る前の考察

ボリューム調整による入力段のフィルタ特性の変化も気がかりではあるが,PC出力を同じ大きさで比較してみると,ちょっと出方が違うみたい.
USBDACは出力振幅がでかいので,PCで絞って聞いていたけれど,今回はPC出力はDAC, このヘッドフォンアンプで減衰させているわけだけれども,本来の音がこういう低音の効いたものなのかもしれない.な...

リファレンスが無いから,なにが正しいのかわからなくなってきたぜwww
もうひとついえるのは,ヘッドフォンは所詮ヘッドフォンであるということかな...音圧を体で感じられるスピーカには敵わないわ.たぶん.

もちろん,双方ともにシステムがどの程度まで練られているかによるのだろうけれど.特にスピーカともなると部屋の影響まで受けてくるかなぁ.ヘッドフォンだと,密閉型を選んでしまえば,外の音を遮断できるから,場所に関係なく再現できるのが強みかなぁ.(騒音が酷すぎるところは除くw


抵抗差し替えてエージングは要るかしらねぇ.一度レポあげておいたほうがいいな.ケーシングも未だなんだけどw
# 図面ナシでエイヤで空けてしまうか・・・.いつもコレで失敗するんだよなぁ('A`

*3 : デジットの高級ボリューム(アルプス?)を使用

*4 : 配送遅れで入手できず.レポに間に合わなかった.

*5 : "こういう音が聞こえる"という記憶も含む.つまり劣化している...のか?