はてなキーワード: DSNとは
以下の記事について.
2029年に地球外文明から人類にメッセージが届く? 科学者も期待をかける「白色矮星付近からの返信」
https://web-mu.jp/paranormal/52364/
宇宙人がいたとして,本当に1973年に送った電波を宇宙人が受信できて,その返信を地球人が受信できるのか.疑問だったのでChatGPTさんに聞いてみた.
1973年、NASAが探査機パイオニア10号に向けて送信した無線信号は、その先にある恒星系へも届くはずである。仮にこれらの星の知的生命体が、その無線信号を受信しようとしたとき、どのくらいの規模、感度のアンテナと信号復元能力が必要か?地球の技術で、同じ距離から送られてきた無線信号を受信する技術・機材はあるか?
以下では、「1973年にNASAがパイオニア10号に向けて送信した電波(指令信号やテレメトリ送信)」が、さらにその先の恒星系へ到達した場合に、それを受信しようとする知的生命体に必要なアンテナ規模や受信感度、そして同等の距離からの電波を地球側が受信可能かどうか、という観点で概説します。実際には正確な数値は周波数帯や送信電力、信号処理方法など多くの要素に依存しますが、ここでは概略のイメージを示します。
1. パイオニア10号に指令を送信した当時の地球側の送信スペック
送信周波数帯: パイオニア10号との通信はS帯(約2GHz前後)で行われていました。
送信電力: 数kW程度の送信機を地上局が使用(厳密には指向性が高く実効的な放射電力(EIRP)はさらに大きい)。
地上局アンテナ: NASAの深宇宙通信網(DSN)では直径64m級(当時)のパラボラアンテナなどが用いられた。
距離: 1973年当時、パイオニア10号は数AUから十数AUほど離れた位置(木星軌道付近~木星フライバイ後)に存在していた。
しかし、この通信信号は当然、宇宙空間を光速で拡散していきます。そのため、さらに何十光年・何百光年先にある恒星系にも到達「はする」ことになります。ただし距離が大きくなるにつれ、電波強度は 1/𝑟^2 で減衰していきます。
たとえば10光年(約10^17 m)先での電波強度は、1AU(約1.5×10^11 m)での強度に比べて
だけ減衰します。1光年は約6.3×10^4AUなので、10光年なら約6.3×10^5AU。そこから
と、10光年先では1天文単位あたりの強度の10^-12程度にしかなりません(実際にはさらに詳細なアンテナ利得・指向性などが絡むのでオーダーで見ています)。
地球のDeep Space Network(DSN)では、数十AU~数百AU程度先の探査機(Voyagerなど)からの微弱な信号を受信しています。これは探査機送信電力が数W~20W程度、周波数帯はやや上のX帯(約8GHz)あるいはKa帯(30GHz)などを使いつつ、高利得アンテナで地上局が受信を行い、さらに超狭帯域で信号処理をしているからです。
しかし「数十光年」のスケールは「数十AU」の1万倍以上離れており、電波強度は数十AUの場合の(1万)^2 = 10^8分の1(10^8倍減衰)よりもはるかに弱くなります。実際は1光年=約63,000AUですから、たとえば50光年先だと
で、数十AUと比べると何万~何十万倍も遠いオーダーになります。よって通常のDSN相当のサイズ(直径 70mクラス)では、とても検出困難と考えられます。
もし「同じS帯の数kW送信・70m受信機」という想定で数十~数百光年先からの信号を捉えるには、以下のいずれか、あるいは複数の組合せが必要になります。
数km級、あるいはそれ以上の直径が必要になる可能性がある。現実的には困難。
数十~数百~数千ものパラボラアンテナを地球規模・あるいは月や宇宙空間をも巻き込む形で電波干渉計として合成し、膨大な合成口径を得る。将来的なSKA(スクエア・キロメートル・アレイ)などの拡張構想に近い。
信号がわずかでもバンド幅を極端に狭くすればS/Nは向上する。狭帯域SETI観測のように、Hzオーダー・mHzオーダーまで絞って長時間積分する、など高度なデジタル信号処理を駆使する。
もともとの送信側が極端に高出力・高利得アンテナで指向性を絞って送信する
受信側の負担を減らすには送信電力や指向性ゲインを桁違いに高める必要がある(大電力ビーム送信)。
実際に未知の星間通信を成立させるには、上記のように「超高性能アンテナ」+「超狭帯域処理」+「相当の送信電力」という組合せが必要になります。
結論としては、「今の地球の技術でも理論的には可能」ですが、「実用的な設備規模」や「膨大な観測時間と信号処理」が必要です。たとえば以下のような状況が考えられます。
たとえ非常に微弱な信号でも、周波数を極端に限定し、長時間データを積分(平均化)することでノイズを下げ、S/N比を稼ぐ手法がすでに行われています。SETI研究では、広範囲な周波数を走査しながら狭帯域の人工信号らしきものを探索する手法がありますが、それをさらに極端化して、特定の周波数を狙って超狭帯域・長時間積分すれば、送信電力が小さくとも検出の可能性は上がります。
星間ガスや散乱などによる減衰は、電波の周波数によっては大きくなる場合があります。また、地球の大気や地上環境雑音(人工衛星やレーダーなど)の影響も無視できません。さらに「どの星方向を狙うか」「どの周波数帯で通信しているか分からない」という問題もあり、実際に「地球の既存装置でキャッチしよう」とするには、相当の観測リソースが必要になります。
4. まとめ
数十~数百光年先でパイオニア10号への指令電波を受信するためには、非常に大口径のアンテナや、巨大アレイ(電波干渉計)、狭帯域観測・長時間積分などが必要となる。いわゆるパワーやアンテナゲイン、受信系の超高性能化なしでは、通常のDSNクラスの設備ではほぼ検出不能なほど弱い信号になる。
地球側が“同等の距離”から飛んでくる電波信号を検出できるかどうか
理論的には、超狭帯域・長時間積分を組み合わせれば、今ある技術の延長でも検出可能な可能性がある。
ただし巨大施設(たとえばSKA等)のように大規模なアンテナアレイと高度な信号処理を組み合わせることが前提になる。現行の設備でも「SETIレベルの狭帯域探索」は可能だが、何十光年も先に存在する非常に弱い信号を特定の周波数で捉えるには、相当の工夫と時間が必要である。
つまり、「1973年にNASAが送信した電波は理論上は恒星間を伝播し、もし受信する文明があれば捉えられるはずだが、実用上はかなり大規模・高感度な設備を要する」というのが結論です。また、同様に地球側も「もし相手側が数十光年先から似たような出力で信号を送ってきた場合には、非常に狭帯域で長時間積分するなどの先端的な技術を駆使すれば、ギリギリ検出の可能性はある」ということになります。
できたできた。自己解決。多分誰にも役に立たないだろうが書いておこう。
DB2はODBCの設定以外にNodeとDBの設定情報が必要らしい。それがなんなのかはわからない。
GUIのODBCデータソースで追加すると、これが裏で作ってくれるっぽいが
ODBCCONF.exeでは作ってくれず、エラーとなる。らしい。
"C:\Program Files\IBM\SQLLIB\BIN\db2cmd.exe" /c /w db2 catalog tcpip node FOO remote 192.168.1.1 server 10000 "C:\Program Files\IBM\SQLLIB\BIN\db2cmd.exe" /c /w db2 catalog db FOO at node FOO odbcconf /A {CONFIGSYSDSN "IBM DB2 ODBC DRIVER - DB2COPY1" "DSN=FOO|DATABASE=FOO|SYSTEM=192.168.1.1:10000|UID=db2admin|PWD=password"}
で追加できる。知らんだけで最後はODBCCONFではなく、db2側のでDSNも追加できるのかもしれない…
さらに「 - DB2COPY1」が何なのかさっぱりわからん。「IBM DB2 ODBC DRIVER」もあるんだけども。
というか、こういう要望無いんだろうか?探してもAIに聞いてもなかなかヒットせず
リファレンス見ながらだましだましやってやっとたどり着いた。
odbcconf /A {CONFIGSYSDSN "IBM DB2 ODBC DRIVER - DB2COPY1" "DSN=FOO|DATABASE=FOO|SYSTEM=192.168.1.1:10000|UID=db2admin|PWD=password"}
だと「ドライバーの ConfigDSN、ConfigDriver、または ConfigTranslator が失敗しました」とあてにならないエラーが出てしまう。
iAccessは
odbcconf /A {CONFIGSYSDSN "iSeries Access ODBC Driver" "DSN=BARLIB|DRIVER=IBM i Access ODBC Driver|SYSTEM=192.168.1.1|DefaultLibraries=BARLIB|CMT=3|SORTTYPE=2|LANGUAGEID=JPN"}
なんかちがうんかなぁ。。。
私の持てる知識を絞り出してなんとか完成しました。
**************************************************************************************
完成したサイトがこちらです。
LapyNetニュース
**************************************************************************************
私は普段webとは関係ない仕事してます。なんとか休日を利用して、
メインのコードはこんな感じ
----------------------------------------------------------------------------------------------------------------------
App::uses('Sanitize', 'Utility');
class RssfeedsController extends AppController {
public $helpers = array('Html','Form','Session','Number','Cache');
public $uses = array(
'Rssfeed',
'Tweet',
'Wadai',
'Rank',
'Oracle'
);
**************************************************************************************
public function index() {
$title_for_layout = "LapyNetニュース";
$content = "Hello World!!";
$this->set(compact('title_for_layout','content'));
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' = > array(
'and' = > array(
'Rssfeed.time' = > $today,
)),
'order' = > 'tweets desc',
'limit' = > '50'
);
$this- >set('posts',$this- >Rssfeed- >find('all',$params));
$paramz = array(
'order' = > 'Rssfeed.id desc',
'limit' = > '10'
);
$this->set('posts2',$this->Rssfeed->find('all',$paramz));
$paramz = $this- >Rssfeed- >query('SELECT id,title FROM rssfeeds order by id desc limit 10');
$this->set('posts2', $paramz);
$parapara = $this- >Oracle- >query('SELECT id,title FROM oracles order by id desc limit 10');
$this- >set('postx', $parapara);
$funking = $this- >Rank- >query('SELECT id,frank FROM ranks where creation=(select max(creation) from ranks)');
$this- >set('funking', $funking);
}
**************************************************************************************
public function mizuno() {
$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '30'
);
$recent_posts = $this->Oracle->find('all',$parapara);
return $recent_posts;
}
**************************************************************************************
public function wadai() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 4
)),
'order' => 'tweets desc',
'limit' => '100'
);
$this->set('posts',$this->Rssfeed->find('all',$params));
$this->set("title_for_layout","2CHニュース-LapyNetニュース");
$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postyy',$this->Rssfeed->find('all',$paramz));
$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '10'
);
$this->set('postyx',$this->Oracle->find('all',$parapara));
$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');
$this->set('funking', $funking);
}
**************************************************************************************
public function hot() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 3
)),
'order' => 'tweets desc',
'limit' => '20'
);
$title_for_layout = "LapyNetニュース";
$this->set("title_for_layout","ニュース-LapyNetニュース");
$this->set('posts',$this->Rssfeed->find('all',$params));
$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '10'
);
$this->set('postxx',$this->Oracle->find('all',$parapara));
$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postsxxx',$this->Rssfeed->find('all',$paramz));
$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');
$this->set('funking', $funking);
}
**************************************************************************************
public function newnew() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 2
)),
'order' => 'tweets desc',
'limit' => '20'
);
$this->set("title_for_layout","エンタメニュース-LapyNetニュース");
$this->set('posts',$this->Rssfeed->find('all',$params));
$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '10'
);
$this->set('postszz',$this->Rssfeed->find('all',$paramz));
$paramz = $this->Oracle->query('SELECT id,title FROM rssfeeds order by id desc limit 10');
$this->set('postszz', $paramz);
$parapara = $this->Oracle->query('SELECT id,title FROM oracles order by id desc limit 10');
$this->set('postzy', $parapara);
$funking = $this->Rank->query('SELECT * FROM ranks where creation=(select max(creation) from ranks)');
$this->set('funking', $funking);
}
**************************************************************************************
public function top() {
if(date("G")>0 and date("G") < 7){
$today = date("Y-m-d", strtotime('-1 day'));
}else{
$today = date("Y-m-d");
}
$params = array(
'conditions' => array(
'and' => array(
'Rssfeed.time' => $today,
'Rssfeed.kubetu' => 1
)),
'order' => 'tweets desc',
'limit' => '20'
);
$this->set('posts',$this->Rssfeed->find('all',$params));
$param = array(
'conditions' => array('times > current_timestamp + interval -600 minute and Kubetu = 4'),
'order' => 'tweets desc',
'limit' => '30'
);
$this->set('posts2',$this->Rssfeed->find('all',$param));
}
**************************************************************************************
public function view($id = null ) {
$this->Rssfeed->id = $id; //驥崎ヲ√↑荳譁・i縺励>
$user = AuthComponent::user();
$TwimStatus = ClassRegistry::init('Twim.TwimStatus');
$TwimStatus->getDataSource()->setToken(AuthComponent::user());
$statuses = $TwimStatus->tweet();
$rairai = $this->Rssfeed->read(title,$id);
$alcol = $this->Rssfeed->read();
$this->set('post', $alcol);
$this->set('post2', $user);
$this->set('post3', $statuses);
$this->set("title_for_layout",$rairai[Rssfeed][title]."-LapyNetニュース");
$paramz = array(
'order' => 'Rssfeed.id desc',
'limit' => '20'
);
$this->set('postszz',$this->Rssfeed->find('all',$paramz));
$parapara = array(
'order' => 'Oracle.id desc',
'limit' => '30'
);
$this->set('postzy',$this->Oracle->find('all',$parapara));
}
**************************************************************************************
public function add() {
if($this->request->isPost()){
if($this->Tweet->save($this->data)) {
$this->Session->setFlash('seikou');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
}else{
$this->Session->setFlash('sipai');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
}
}
}
**************************************************************************************
public function delete($id = null) {
$this->Rssfeed->id = $id;
$this->set('set', $this->Rssfeed->read());
$this->redirect(array('controller'=>'tweets','action'=>'delete',$this->data['tweet']['rssfeed_id']));
}
**************************************************************************************
public function oracle() {
if($this->request->is('post')) {
$user = AuthComponent::user();
$TwimStatus = ClassRegistry::init('Twim.TwimStatus');
$TwimStatus->getDataSource()->setToken(AuthComponent::user());
$contents1 = $this->request->data['Rssfeed']['contents'];
$contents2 = $this->request->data;
$statuses = $TwimStatus->tweet($contents1);
if($this->Rssfeed->save($contents2)) {
$this->Session->setFlash('成功です。');
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
$this->redirect($this->referer());
}else{
$this->redirect(array('controller'=>'rssfeeds','action'=>'view',$contents11));
$this->Session->setFlash('失敗です。');
}
}
}
**************************************************************************************
public function makelist() {
$rssfeeds = $this->paginate();
if ($this->request->is('requested')) {
return $rssfeeds;
} else {
$this->set('rssfeeds', $rssfeeds);
}
}
}
----------------------------------------------------------------------------------------------------------------------
rssフィードはこんな感じです。
----------------------------------------------------------------------------------------------------------------------
#!/usr/bin/php
<?php
header('Content-type: text/html; charset=UTF-8');
require_once ('/var/www/html/s/magpierss/rss_fetch.inc');
define('MAGPIE_CACHE_AGE', 60*5);
define('MAGPIE_CACHE_DIR', '/var/www/html/s/cache/');
define('MAGPIE_OUTPUT_ENCODING','UTF-8');
$urls = array(
'*********************************');
$items = getRssList($urls);
echo '<ul>';
foreach ($items as $item) {
$href = mb_convert_encoding($item['link'], "UTF-8", "auto");
$title = mb_convert_encoding($item['title'], "UTF-8", "auto");
$description = mb_convert_encoding($item['description'], "UTF-8", "auto");
$megami = mb_convert_encoding($description, "UTF-8", "auto");
**************************************************************************************
$all = 'http://urls.api.twitter.com/1/urls/count.json?url='.$href;
$Rits = file_get_contents($all);
$Olfe = mb_convert_encoding($Rits, 'UTF-8', 'auto');
$data = json_decode($Olfe);
$tweets = $data->count;
**************************************************************************************
$checkman = db_check_urls($href);
$checkman2 = db_check_pr($title);
$nowtimes = date('Ymd');
if($checkman == 0 &amp;&amp; $checkman2 == 0){
#$hrefs = urlencode($href);
db_put_urls($nowtimes,$href,$title,$description,$tweets);
echo "<li><a href=$href>$title</a><br>$megami<p>$tweets</p><p>$checkman</p></li>";
}else{
}
}
echo '</ul>';
**************************************************************************************
function getRssList($urls)
{
$rssitems = array();
foreach ($urls as $url) {
$obj = fetch_rss($url);
$rssitems = array_merge($rssitems, $obj->items);
}
return $rssitems;
}
**************************************************************************************
function db_check_pr($japanese){
$moji = mb_substr($japanese,0,2);
if($moji == 'PR'){
return 1;
}else{
return 0;
}
}
**************************************************************************************
function db_check_urls($href){
require '/var/www/html/s/database_conf.php';
try {
$db = new PDO($dsn, $dbUser, $dbPass);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT count(*) AS count FROM rssfeeds WHERE urls = :language';
$prepare = $db->prepare($sql);
$languages = array($href);
foreach ($languages as $language) {
$prepare->bindValue(':language', $language, PDO::PARAM_STR);
$prepare->execute();
$result = $prepare->fetchColumn();
if ($result > 0) {
return true;
}else{
return false;
}
}
} catch (PDOException $e) {
echo 'エラーが発生しました。内容: ' . h($e->getMessage());
}
function h($var)
{
return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
}
}
**************************************************************************************
function db_put_urls($nowtimes,$href,$title,$description,$tweets){
require '/var/www/html/s/database_conf.php';
try {
$db = new PDO($dsn, $dbUser, $dbPass);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sikibetu = 5;
$moto = "アニゲー速報VIP";
$sql = 'insert into rssfeeds (id, time,urls,title,contents,tweets,times,kubetu,teikyo) values (?, ?, ?, ?, ?, ?, ?, ?, ?)';
$prepare = $db->prepare($sql);
$prepare->bindValue(1, 0, PDO::PARAM_STR);
$prepare->bindValue(2, $nowtimes, PDO::PARAM_STR);
$prepare->bindValue(3, $href, PDO::PARAM_STR);
$prepare->bindValue(4, $title, PDO::PARAM_STR);
$prepare->bindValue(5, $description, PDO::PARAM_STR);
$prepare->bindValue(6, $tweets, PDO::PARAM_STR);
$prepare->bindValue(7, 'cast( now() as datetime)', PDO::PARAM_STR);
$prepare->bindValue(8, $sikibetu, PDO::PARAM_STR);
$prepare->bindValue(9, $moto, PDO::PARAM_STR);
$prepare->execute();
} catch (PDOException $e) {
echo 'エラーが発生しました。内容: ' . h($e->getMessage());
}
}
?>
---------------------------------------------------------------------------------------------------------------------
**************************************************************************************
参考にした書籍
CakePHP2 実践入門 (WEB+DB PRESS plus)
CakePHP2 実践入門 (WEB+DB PRESS plus)
作者: 安藤祐介,岸田健一郎,新原雅司,市川快,渡辺一宏,鈴木則夫
発売日: 2012/09/29
購入: 5人 クリック: 165回
Webアプリ開発を加速する CakePHP2定番レシピ119
Webアプリ開発を加速する CakePHP2定番レシピ119
**************************************************************************************
一番難しいところはtwitterログインとwebサイト連結でした。
ツイート数でランキングしてます、ネットの話題を見つけられます。
ホームページビルダーを使用しています。
今のホームページビルダーは昔と違って高機能ですね。
テンプレートも何種類もあって今はすごいです。
に分かれています。
今更cakephpを使っている人は少ないかもしれませんが、
twitterアカウントあるといつでも参加できますので、