HYPER-Vのレプリケーション設定について(下準備)

タグ: , , | 投稿日: 投稿者:

今回は証明書(自己証明書)でレプリケーションを行います。

※使用するサーバはプライマリ、セカンダリ共にWindowsServer2012R2です。

□自己証明書の作成

プライマリサーバでの作業内容

1.makecertを入手します。

※入手方法につきましてはmakecertで検索すれば出てきます。

2.コマンドプロンプトを起動します。

3.makecertが配置されているディレクトリに移動します。

例:cd C:\Users\tanaka\Desktop

4.makecert.exe -pe -n "CN=ルート証明書名" -ss root -sr LocalMachine -sky signature -r "ファイル名.cer"と入力します。

例:makecert.exe -pe -n "CN=test1" -ss root -sr LocalMachine -sky signature -r "hyper-vtest1.cer"

5.makecert.exe -pe -n "CN=FQDN(コンピュータ名)" -ss my -sr LocalMachine -sky exchange -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2 -in "上記で設定したルート証明書名" -is root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "[ファイル名.cer]"と入力します。

例:makecert.exe -pe -n "CN=TESTPC1" -ss my -sr LocalMachine -sky exchange -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2 -in "test1" -is root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "hyper-vtest2.cer"

これでプライマリサーバのmakecert.exeが保存されているディレクトリにルート証明書(hyper-vtest1.cer)とクライアント証明書(hyper-vtest2.cer)が作成されました。

 

セカンダリサーバでの作業内容

1.makecertを入手します。

※入手方法につきましてはmakecertで検索すれば出てきます。

2.コマンドプロンプトを起動します。

3.makecertが配置されているディレクトリに移動します。

例:cd C:\Users\tanaka\Desktop

4.makecert.exe -pe -n "CN=ルート証明書名" -ss root -sr LocalMachine -sky signature -r "ファイル名.cer"と入力します。

例:makecert.exe -pe -n "CN=test10" -ss root -sr LocalMachine -sky signature -r "hyper-vtest10.cer"

5.makecert.exe -pe -n "CN=FQDN(コンピュータ名)" -ss my -sr LocalMachine -sky exchange -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2 -in "上記で設定したルート証明書名" -is root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "[ファイル名.cer]"と入力します。

例:makecert.exe -pe -n "CN=TESTPC10" -ss my -sr LocalMachine -sky exchange -eku 1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2 -in "TEST10" -is root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 "hyper-vtest20.cer"

※プライマリ4、5で作成したファイル名とも別々にしてください

※CN=ルート証明書名についてはプライマリ、セカンダリそれぞれ違う名前にしてください。

これでセカンダリサーバのmakecert.exeが保存されているディレクトリにルート証明書(hyper-vtest10.cer)とクライアント証明書(hyper-vtest20.cer)が作成されました。

 

 

□作成した自己証明書のインポート

1.対向サーバのルート証明書、クライアント証明書をコピーし入手します。

2.プログラムとファイルの検索でmmcと検索します。

3.ファイル→スナップインの追加と削除の順に選択します。

4.証明書を選択し追加します。

5.コンピュータアカウント、ローカルコンピュータを選択し追加します。

6.信頼されたルート証明機関→証明書の順に選択します。

7.操作→すべてのタスク→インポートの順に選択します。

8.プライマリ、セカンダリそれぞれのルート、クライアント証明書をインポートします。

9.コマンドプロンプトを開き以下を入力します。

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Replication" /v DisableCertRevocationCheck /d 1 /t REG_DWORD /f

※HYPER-Vでレプリケーション設定する際注意されるので注意されないようにする設定です。  

1~9の作業をプライマリ、セカンダリそれぞれ実施します。

 

□hostsファイルの編集

Hyper-Vのレプリケーション設定の際、対向サーバとの通信にIPアドレスではなくホスト名で要求されます。

そのためプライマリ、セカンダリそれぞれのhostsファイルに対向IPアドレス、ホスト名を入力し、ホスト名で通信できるようにします。

これでレプリケーション設定の下準備は終わりです。

Hyper-Vのレプリケーション設定は次回になります。

 

 

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Chromeデベロッパー・ツールを使ってヘッダー情報を確認する

寒くなりましたね!そろそろインフルエンザの季節が到来しますね。

対策にいち早くワクチン打ってもらおうかな~と思っているモリです。

 

今回はWeb開発で調査に活用できるネタとして、Chromeデベロッパー・ツールでヘッダー情報を確認する方法を簡単に紹介します。

 

画面遷移時の通信している詳細情報(HTTPリクエストやレスポンスのヘッダー情報など。。。)を確認する方法です。

まずは対象となる画面上で右クリックして「要素の検証」を押下します。

Chromeデベロッパー・ツールが立ち上がったら「Network」タブを押下して詳細情報を確認できます。

1

 

詳細情報は大きく分けて3つになります。

1.使用されているファイル一覧

2.ファイルに対する各種情報

3.通信の中身の詳細情報

 

 

1.使用されているファイル一覧

 画面で読み込んでいるファイルを一覧表示しています。

 いくつもファイルを読み込んでいる画面では、たくさん表示されているのでファイルの絞り込みをして最小限の表示に切り替えると見やすいです。

2

 

2.ファイルに対する各種情報

 以下の5つの情報の切換えが可能です。

 a.Headers
 b.Preview
 c.Response
 d.Cookies
 e.Timing

 

 Headers情報

  リクエストヘッダーおよびレスポンスヘッダーが確認できます。

3

 

 Preview情報

  ファイルの内容を確認出来ます。

  画像の場合、大きさ・サイズ・ファイルタイプ・URLなどCSSやJSならファイルのソースを確認することが出来ます。

4

 

 Response情報

  レスポンスされた内容を確認出来ます。

5

 

 Cookies情報

  リクエストおよびレスポンス時のクッキー情報が確認出来ます。

6

 

 Timing情報

  画面が表示完了するまでに掛かった時間が確認出来ます。

  要求の送信待機時間やDNSルックアップ・送信時間・待機時間など確認する事でどのリソースが重いのか把握出来ます。

7

 

表示が遅い!やどんな情報を送っているのかなどなど確認する事が出来るのでオススメです。

Network以外にもたくさんの機能があるので、開発や調査に重宝すること間違いなし!

でわでわ。。。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

周波数440Hzの正弦波をサンプリングレート48Kで作ってみる(実践編)

タグ: , | 投稿日: 投稿者:

毎度いかおです

前回-周波数440Hzの正弦波をサンプリングレート48Kで作ってみる(考察編)-で考えたことを実行してみます。

 

データ的にサイン波になったよ〜パチパチ

 

ではつまらんので実際にWAVを作ります

その前に前回の考察の誤りについて

サンプル取得のステップ幅 = 1回転の長さ / 360

は間違いですね。1つのサンプルでどれだけ角度が変わるかですし、1回転の長さってのも変で、"1回転分のサンプル数"っていうのが正しいですね。

サンプル取得のステップ幅 = 360 / 1回転分のサンプル数

でWAVの作り方はgoogle先生に"wav フォーマット 解析"と聞くと答えて下さります。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

static const double     PI      =       3.1415926535f;
static const double     Volume  =       2048.0f;
static const double     SampleRate      =       48000.0f;
static const double     Heltz   =       440.0f;
static const double     DegBase =       360.0f;
static const int        SampleSec       =       5;
static double SampleWidth;

typedef struct {
        char            header[4];
        uint32_t        fileLength;
        char            fmtHead[4];
} FileHeader;

typedef struct {
        char            chunkID[4];
        uint32_t        chunkSize;
        uint16_t        formatCode;
        uint16_t        channels;
        uint32_t        sampleRatio;
        uint32_t        sampleBytePerSeccond;
        uint16_t        alignment;
        uint16_t        bitDepth;
} FormatChunk;

typedef struct {
        char    chunkID[4];
        int32_t chunkSize;
} DataChunk;

int main(int argc, char **argv){
        FILE    *fp     =       NULL;
        double  deg     =       0.0f;
        size_t  asize;
        short   *sample =       NULL;
        long    i;
        size_t  sumSize =       0;

        FileHeader      fileHeader;
        FormatChunk     formatChunk;
        DataChunk       dataChunk;

        fileHeader.fileLength = (sizeof(FileHeader) + sizeof(FormatChunk) +
                        sizeof(DataChunk) + sizeof(short) * (int)SampleRate * SampleSec) - 8;
        memcpy(fileHeader.header,       "RIFF", 4);
        memcpy(fileHeader.fmtHead,      "WAVE", 4);

        memcpy(formatChunk.chunkID,     "fmt ", 4);
        formatChunk.chunkSize   =       16;
        formatChunk.formatCode  =       1;
        formatChunk.channels    =       1;
        formatChunk.sampleRatio =       (unsigned long)SampleRate;
        formatChunk.sampleBytePerSeccond        =       (unsigned long)SampleRate * 2;
        formatChunk.alignment           =       2;
        formatChunk.bitDepth    =       16;

        if(argc < 2){
                printf("Argument 1 must be output wav name\n");
                return -2;
        }

        fp = fopen(argv[1], "wb");
        if(fp == NULL){
                printf("file:%s open error\n", argv[1]);
                return -3;
        }
        sample = (short *)malloc(sizeof(short) * SampleRate * SampleSec);
        if(sample == NULL){
                fclose(fp);
                printf("Allocation error(%lu)\n", sizeof(short) * (int)SampleRate * SampleSec);
                return -4;
        }
       // 今回訂正した部分
        SampleWidth = DegBase / (SampleRate / Heltz);
        memcpy(dataChunk.chunkID,       "data", 4);
        dataChunk.chunkSize     =       sizeof(short) * SampleRate * SampleSec;
        for(i=0;i < SampleRate * SampleSec;i++){
    // 結果が-Volume から Volume までの値のためVolume分プラスに寄せます
                sample[i] = (short)(round(Volume * sin(deg * PI / 180)) + Volume);
                deg     =       deg + SampleWidth;
        }
        fwrite((char *)&fileHeader, 1, sizeof(FileHeader), fp);
        fwrite((char *)&formatChunk, 1, sizeof(FormatChunk), fp);
        fwrite((char *)&dataChunk, 1, sizeof(DataChunk), fp);
        fwrite((char *)sample, 1, sizeof(short) * (int)SampleRate * SampleSec, fp);
        free(sample);
        fclose(fp);
        return  0;
}

それから、ボリュームですが128では小さい(これでも小さいが・・)ので2048にしてます。

できたのが、これです

おお、ラの音じゃん。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

[pgrep][pkill]と言うコマンド・・・

タグ: | 投稿日: 投稿者:

どうもshiraneです。

今まで知りませんでしたが使って見たら、かなり便利なコマンドでした・・・・

◆何が便利なのか?
今まで私は、実行中プロセスの確認やkillする時に、
以下のような流れで行ってました。

                $ ps aux | grep hoge

                プロセスIDを確認する。


                $ kill プロセスID

                IDを指定してプロセスをkill!

また、複数動いている[hoge]というプロセスを纏めてkillする時は、
以下のようにしてました。

                $ ps aux | grep hoge

                hogeの一覧を表示し確認する。

                $ kill `ps aux | grep hoge | awk '{print $2;}'`

                hogeと名前の付いたプロセスを纏めてkill!

◆pgrepの場合

                $ pgrep hoge
                11111           
                22222           
                33333           

                プロセス名[hoge]にマッチするプロセスのIDが表示されます。

                $ pgrep -l hoge
                11111 hoge
                22222 hoge
                33333 hoge

                オプション[-l]を付けると、プロセスIDの後ろにプロセス名が表示されます。
                [-lf]にする事でプロセスのパスも表示させる事ができます。

◆pkillの場合

                $ pkill hoge

                プロセスIDを確認して指定しなくても、hogeというプロセスを全てkillできます。

                ※複数あるhogeプロセスでkillしたくない物があっても、
                 問答無用でkillされてしまうので注意が必要です。


pkillは状況次第でしょうがpgrepは凄く重宝してます。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Android Lollipop での SDカードへ書き込み

タグ: | 投稿日: 投稿者:

こんにちは、kikuです。

Lollipop になりアプリからSDカードへ書き込みできるようになりました。
でも書き込みが可能になっただけで、4.3までの様に自由に書けるわけではないんですね。

これが非常にめんどくさいわけです。。。

今日は Lollipop でのSDカードへの書き込み方についてです。

簡単に説明しますと、、
まずユーザにUI操作で明示的にアクセスを許可するディレクトリを指定してもらう必要があります。(←これが厄介です)
その上で Storage Access Framework を使えば出来るようになります。

具体的には ↓ のコードによって遷移する画面上でユーザに許可してもらいます。

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE);

UIで許可してもらったら、onActivityResult に戻ってくるので、そこでアクセスに必用なURIを取得します。
そのURIから DocumentFile を作成しこれでファイルにアクセスできます。
DocumentFile の作成は ↓ こんな感じです。

public void onActivityResult(int reqCode, int resCode, Intent resData) {
  if (reqCode == REQUEST_CODE && resCode == Activity.RESULT_OK) {
    Uri treeUri = resData.getData();
    DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
    // pickedDir でごにょごにょが可能に
  }
}

この取得した URI から作成した DocumentFile を使えばディレクトリ作成やファイル作成等の書き込みができます。
例えばディレクトリ作成なら ↓ こんな感じ

DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
pickedDir.createDirectory("dir_name");

書き込みを行う毎にURIが必用なのでアプリ側で保持しておきましょう。

一応こんな感じで書き込みできます。なかなか取っ付き難くて理解に苦労しました。。(Googleさん、前の仕様に戻して下さい)

もうGoogleさんはSDカードを使わせる気がないっぽいですよね。
今後のアプリはSDカードを使わないでも動くように作るのが良いのかもしれません。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

DSUって何だ

タグ: , | 投稿日: 投稿者:

Dell System Update 略してDSU。これを使うとLinuxを使用しているDellのマシンのBIOSやファームウェアのアップデートが簡単になります。

どれくらい簡単かというとファームウェアのアップデートにサイトからダウンロードする必要がなくなるくらい簡単になります。

インストールも簡単で、DellのサーバマネージメントシステムであるOpenMangeをインストールしたことがあればほぼステップが同じであることがわかります。

 

まず、レポジトリをダウンロードし、インストールします。

wget -q -O - http://linux.dell.com/repo/hardware/dsu/bootstrap.cgi | bash

次に、ソフトをインストールします。

Red-Hatでのインストール:

yum install dell-system-update

SUSEでのインストール:

zypper install dell-system-update

 

使用方法も簡単です。

アップデートが必要なものの確認:

dsu --inventory

アップデートの実施:

dsu

 

これだけで、BIOSやすべてのファームウェアを最新にすることができます。

しかし、これだけだと上げたくないファームウェアも上げてしまうことがあるため、種類別でアップデートを行うことができます。

カテゴリの確認:

dsu --category-values

選択したカテゴリのアップデート

dsu --get=<上記で取得したカテゴリの1つ>

 

なお、このDSUには前身があり、それは、Dell Linux Repositoryという名称でした。

こちらのRed-Hat系でのインストール手順と使用方法も記載しておきます。

インストール:

wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash 
yum install dell_ft_install 
yum install $(bootstrap_firmware)

使用方法(アップデートの確認):

inventory_firmware

使用方法(アップデートの実施):

update_firmware

 

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

[WordPress]需要度低めだけど意外と助かるカスタマイズ3選

タグ: , | 投稿日: 投稿者:

こんにちは、ニタです。
WordPressを利用したWebサイトを開発する際、既存テーマファイルをカスタマイズしたり、プラグインをインストールしていきます。
それでも対応できないものは、使用するテーマファイル内のfunctions.phpにコードを記述するなどして対応していきます。
今回は、その中でも需要度低めな?カスタマイズ方法をいくつかご紹介します。

generatorのmetaタグを削除

WordPressでは、headタグ内にgeneratorのmetaタグが挿入されます。
これはページ作成ツールの情報なのですが、あまり必要性がないのと、セキュリティ面を考慮しても削除したほうが良いです。
※バージョンを外部に晒すことになるので、WordPressをアップデートしていない場合、攻撃対象になるため。

利用中のテーマファイルにある、functions.phpに以下を追記すると、generatorのmetaタグが作成されません。

if(has_action('wp_head','wp_generator')) {
    remove_action( 'wp_head', 'wp_generator' );
}

これだけでもページのソース上からは削除されますが、同時に生成されるRSSフィードなどにも生成ツール情報が書き込まれるので、そちらも削除します。

$actions = array( 'rss2_head', 'commentsrss2_head', 'rss_head', 'rdf_header',
'atom_head', 'comments_atom_head', 'opml_head', 'app_head' );
    
foreach ( $actions as $action ) {
    if ( has_action( $action, 'the_generator' ) ) {
        remove_action( $action, 'the_generator' );
    }
}

WordPressからのメール送信でSMTPを利用する

WordPressには、wp_mailというphpmailerを使用したメール送信関数がデフォルトで備わっています。

関数リファレンス/wp mail – WordPress Codex 日本語版

サイトポリシー上、SMTPを利用してメール送信する場合は、phpmailerの設定処理をカスタマイズして対応します。
こちらも、functions.phpに記述します。
send_smtp_emailという関数名は適宜変更しても構いません。

add_action('phpmailer_init','send_smtp_email');
function send_smtp_email( $phpmailer )
{
    // SMTP有効設定
    $phpmailer->isSMTP();

    // メールサーバーのホスト名
    $phpmailer->Host = "使用するSMTPサーバ名";

    // SMTP認証の有無(true か false)
    $phpmailer->SMTPAuth = true;

    // SMTPポート番号(25,465,587など適宜) 
    $phpmailer->Port = "587";

    // SMTP認証時のユーザー名
    $phpmailer->Username = "ユーザー名";

    // ユーザーのパスワード
    $phpmailer->Password = "パスワード";

    // SMTP暗号化方式(tls か ssl)
    $phpmailer->SMTPSecure = "tls";

    // 送信者メールアドレス
    $phpmailer->From = "test@example.com";
    
    // 送信者名
    $phpmailer->FromName = "送信者名";
}

テーマ内でセッションを使う

基本的にWordPressのフロント側では、PHPのセッションは使用していません。
ページによってはセッションを利用したページ処理があると思います。
セッションを使う場合はこんな感じでfunctions.phpに記述します。
common_session_startという関数名は適宜変更しても構いません。

add_action('init', 'common_session_start');
function common_session_start(){
    if(!isset($_SESSION)){
        session_start();
    }
}

いかがでしたでしょうか。
ちょっとニッチなカスタマイズでしたが、ご利用いただければと思います。
それでは。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Hyper-Vネットワークドライバの再インストールについて

タグ: , , | 投稿日: 投稿者:

今回はHyper-VゲストOSのネットワークアダプタ(仮想スイッチ)を削除したはいいけれどその後の復旧に時間が掛かったため忘れないためにも書いていきます。

経緯

別の対応でネットワークアダプタをレガシーネットワークアダプタに変えてどうなるか様子見します。

そのため一旦ネットワークアダプタを削除します。

結果的に改善しなかったため、元に戻しましたがゲストOSのネットワークがダウンしておりネットワークアダプダのドライバが認識していない事が分かりました。

対応

1.統合サービスのアンインストール

検索したところ統合サービスをアンインストールして、再度インストールすればいいような記事がありました。しかし使用しているOSがWindows2012ServerR2では通用せずアンインストールが出来ませんでした。

2.ドライバの再インストール

デバイスマネージャーを確認すると不明なデバイスとして認識はしているもののドライバの更新を行うと必要なファイルが無いとエラーが表示されます。

同OSで別の仮想マシンからドライバをコピーします。

再度デバイスマネージャーからドライバの更新を行ったところ「サードパーティのINFにデジタル署名情報が含まれていません」とエラーが表示されます。

デジタル署名を無効にするため一旦再起動しF8キーを連打しセーフモード選択画面に移動しデジタル署名を無効にするを選択し起動します。

再度デバイスマネージャーからドライバの更新を行い成功しました。

※ドライバのコピーにはDoubleDriverというツールを使用しました。

解決するのに2.5時間程掛かりました。統合サービスのアンインストールばかりに気が向いてましたが同じようなマシンがある事に気づいてからは30分程で解決出来ました。

消して再度作成すれば自動でドライバ認識するだろうと思って実行しましたが読みが甘かったです。

 

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Google検索

タグ: | 投稿日: 投稿者:

どもども、モリです。

 

コーティングしているとき、Google先生に色々聞いて見ることって多々あると思います。

エラーメッセージが出た時だったり環境構築だったりと参考にするサイトに辿り着くまでに

時間が流れ無駄にしてしまった経験が多くあります。

そこで今回はいつものように備忘録がてらGoogle先生への便利な質問作法(笑)を書きたいと思います。

 

検索の仕方はいろいろありますが、今回は実際に使って便利ってやつを抜粋してみます。

Google

 

フレーズ検索

完全一致として検索する時に便利 "文字列" ダブルクォーテーションで囲む
AND検索 複数キーで検索 文字列1 AND 文字列2 半角大文字で!
OR検索 かつで検索 文字列1 OR 文字列2 半角大文字で!
除外検索

特定の文字列を除外

先頭文字列の検索結果から後述の文字列が除外されます。

-文字列

複数:-文字列 -文字列

ハイフンをキーの前に付与する(スペースは空けない)

あいまい検索

エラーメッセージ等検索する時重宝してます。

*文字列

ワイルドカードを付与する

フレーズ検索と組み合わせて環境依存している文字列部分のみ置き換えて検索すれば類似ページにHIT!

ページ内検索 辿り着いたはいいがページ内にないじゃん!が解消されます。 intext:文字列

「intext:」を文字列の先頭に付与

ページタイトルを除外してページ内に記述されているページのみが対象

URL検索 URLを対象に検索 inurl:文字列 「inurl:」を文字列の先頭に付与
関連サイト検索 関連サイトを検索する時便利

related:URL

「related:」をURLの先頭に付与

指定URLに関連したサイトを検索

指定サイト内検索 指定サイト内のみの範囲で検索できるので使えます。 site:URL 文字列 「site:」をURLの先頭に付与してスペースを開けてキー文字列

 

これらを組み合わせて検索する事で大概のものは賄えるかと・・・

 

余談ですが、Google先生のおふざけ検索も色々あるみたいで試してみるとおもしろいですよ!

・くるりんぱ

 「do a barrel roll」で検索

・Google先生崩壊

 こちらはGoogle先生を崩壊させた状態で検索できるサイトです。

 このサイトは他にも提供しているので暇つぶしにどうぞ

 なかなかおもしろい(笑

 http://mrdoob.com/projects/chromeexperiments/google-gravity/

 

でわでわ。。。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

周波数440Hzの正弦波をサンプリングレート48Kで作ってみる(考察編)

タグ: | 投稿日: 投稿者:

まいど、いかおです

表題の件、考えてみます。間違ってたらツッコミをよろしくお願いします。

サイン波ですからsin/cos/tanのsinを使いますよね。これを1秒間に440回転させればいいんです。

ここでサンプリングレートが48Kですから、1回転の長さ(サンプル数)は

1回転の長さ=48000/440

この長さで1回転させるのでサンプル取得のステップ幅は

サンプル取得のステップ幅 = 1回転の長さ / 360

で、コード的にはこんな感じなのか?

// 1秒分の440Hzのサイン波作成
// サンプルはunsigned shortで作ってみる(16bit)
// 音量はどうしよう・・・とりあえず128
static const double PI =  3.1415926535;
static const short vol = 128;
double sampleWidth = (48000 / 440) / 360;
double deg = 0.0f;

unsigned short sample[48000]:

for(int i=0;i < 48000;i++){
    sample[i] = (unsigned short)vol * sin(deg * PI /180);
    deg = deg + (48000 / 440) / 360;
}

次回、実際にやってみて検証します。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook