忍者ブログ
え?全力で生きているかって? ――答えはYesだ。当たり前だろそれが人生なんだよ!!
[489]  [488]  [487]  [486]  [485]  [484]  [483]  [482]  [481]  [480]  [479
1/31 11:47 ソース修正(if msg=="get()" then 付近からファイルチェック追記)



ということで、メール受信サーバー作ったからソース晒す。

一応このへんとかこのへんとか見ればAPIとか分かりますんで。

基本lua言語ですよ。大丈夫や俺だってこれが初めてなんやから。



ということでソース。の前にいくつかお話。



1つ目。モデムの設定から。


まぁ普通にモデム作るじゃん?shift押しながらマシンに貼っつけるじゃん?でもこれだけじゃぁだめなんだな。律儀にモデムをONにしてやらなきゃならんのだよ。なかなかこだわっとるわ。



ということで、ルートディレクトリにstartupってのを作って、マシン起動時にモデムONになるように設定してやる。startupってのを作ることで、マシン起動したときにそのファイルに書かれたことを実行するようになる。

romディレクトリの中にもあるけどそれとちゃうで!一緒かもしれんけどそれはいじらんほうがいい。ちゃんとルートに作れよ!

cd /
edit startup

って打つとエディタ起動


起動したら

rednet.open("モデムつけた場所")

って書く。モデムつけた場所は、パソコン正面から見て

右:right
左:left
上:top
背面:back

て書けばおk。俺は背面につけたから、rednet.open("back") って書いた。
これもwikiに書いてあるからちゃんと読みましょう。

書いたら、ctrl押してsave、ctrl押してexitでエディタ終了させる。

これで、パソコン起動したらモデムがONになるよ。

試しに、reboot って打ってみ。起動してからモデム見たら赤く光っとるで。完璧やん。



ちなみにrednet.open()だが、プログラム書くときに一番上に書いといてもおk。というか、ソース共有するときだったら書いたほうがいいのかもしれない。が、俺はもうモデムONがデフォという考え方でいく。


これを、サーバー機とメインマシンとどっちもやっとく。


そしてもう一つ。idって打ってどっちもマシンのIDを調べとくこと。メッセージ送信するときに必要。



2つ目。rednetのお話をちょっと。

今回ネックになってるのが、rednet.send()とrednet.receive()の部分。なぜかというと、相手がreceive()で待ち構えている時じゃないとsend()したメッセージが届かないから。

しかしずっとreceive()で待機なんかするわけないやん。作業でけへんもんな。どうしよか。じゃぁ代わりにサーバーたんに受信頼もうよってのが今回の趣旨。

つまり、メッセージを一回サーバーで受信してもらって、それを転送してもらうっていう動作をする。

…面倒ですよね。でもこれでメインマシンで何してても常にメール受信できるんです!何通でもどうぞwwwって感じ。



3つ目。今回のマシン周りの設置

こんな感じ。2つPCあるけど受信サーバーは左側のPC。右側のPCはまだ関係ない。


2013-01-31_08.19.58.png






メール受信したらレッドストーントーチが光るようにしたった


2013-01-31_08.20.49.png







プログラム起動したらこんなかんじでメール受信待機


2013-01-31_08.21.20.png







メッセージ受信したら一応メッセージ表示される。
裏でlogにメッセージ書き貯めていって、また待ち始める。


2013-01-31_08.21.06.png







メインマシンから要求がきたら、今までサーバーが受信したメールを全部転送し始める。



今回作ったプログラムの動作イメージを書くとこんな感じ。



メールをずっと待ってるサーバーたん
  ↓
メールきた!
  ↓
メールの内容で動作が変わるよ

・メッセージの内容が「get()」やったら
 →ログ(未読メッセージ)をメインマシンに送る(レッドストーントーチ ジュワ...消)
・メッセージの内容が「getall()」やったら
 →全ログ(メッセージ一覧)をメインマシンに送る
・それ以外(hi とか hello とか)やったら
 →ログに書き溜める(レッドストーントーチ ピッカーン 光)

  ↓
またメールを待つサーバーたん



という感じ。



じゃぁソース晒そうか。面倒くさがりな俺だがたまにはコメントつけて丁寧に解説しよう

今回の環境を書いとくと、

・メインマシン→アドバンスドPC。ID=27
・メール受信サーバー→普通のPC。ID=28

あと、

・コメントは -- (ハイフン2つ)の部分。luaの仕様。
・日本語のコメントは書けない。書けても書くな。
・英語のコメントは実際に俺も書いた。書かなくてもいいがこれぐらい書いといたほうが後で多少捗るかもね
・「受信ランプ」ってコメントがあるが、受信した時にレッドストーントーチを光らせるように設定したかったらそれ書いて。いらなければ消すかコメントアウトでよろしく。細かい説明は後でする。


今回のプログラム名はpop_serverでいく。ここは好きに変えてもらっておk。

じゃぁ始める。edit pop_server って打ってエディタ起動。以下ソースコード


print("pop server #28\n")
--print()で文字の出力ができる。
--#28ってのはサーバーIDが28だったから
--\nは改行。
 
SEND_ID=27  --メインマシンのID。今回は27
SEND_ID=tonumber(SEND_ID)  --説明省略
 
---------------
--file writer
---------------
--ファイル書き込みする関数を作る
filewriter=function(filename,str)
  --file open
  file=io.open(filename,"a")  --ファイルを追記モードでオープン
 
  --writing
  if file then
    file:write(str)  --ファイルに書き込み
  else
    print("Cannot writing!")  --エラー処理は忘れずに☆
  end
 
  --file close
  file:close()  --ファイルクローズは基本ですよ
 
end
 
--sign off
rs.setOutput("left",true)  --受信ランプ off
 
 
----------
--main
----------
while true do  --無限ループ
  --message get wait
  print("waiting...")  --メッセージ受信待機のとき表示
 
  event,id,msg=os.pullEvent("rednet_message")
  --os.pullEvent("rednet_message")
  --rednet.receive()と見かけの動作は同じ
  --なんでreceive()じゃないかって?大人の事情だよ
  
  print("--------------------")
  print("id:"..id)
  print("msg:"..msg)
  print("--------------------")
  --上の4行は書かなくてもいい。
  --受信したメッセージが見れるだけ
  
  b=false  --(ry
 
  if msg=="get()" then
    --log forwarding
    --今回は未読のメッセージをlogとして保存していく
    --未読メッセージの送信を行う部分

    if fs.exists("/log") then
      --未読メッセージがある場合
    
      --log message load
      logfile=io.open("/log","r")  --/logを読み込みモードでオープン
      logmsg=logfile:read("*a")  --*aでファイル上から下まで読み込み
 
      --message send
      while b==false do  --bがfalseの状態なら無限ループ
        print("sending...")  --送信中表示
        rednet.send(SEND_ID,logmsg)
        --rednet.send(相手ID,メッセージ)でメッセージ送信
        --ここではメインマシンに未読メッセージ送信
      
        id,msg=rednet.receive(2)
        --2秒間だけメッセージ受信
        --ここで「stop()」ってメッセージが来たら送信をやめる
        if msg=="stop()" then
          b=true  --bがtrueになったからループ終了
        end
      end
    else
      --未読メッセージがない場合
      while b==false do
        print("sending...")
        rednet.send(SEND_ID,"Mail is empty.")

        id,msg=rednet.receive(2)

        if msg=="stop()" then
          b=true
        end
      end
    end
 
    --sign off
    rs.setOutput("let",true)  --受信ランプ off
 
    --logfile delete
    fs.delete("/log")
    --ログファイル削除
    --ここで削除することで未読メッセージだけ貯められる
  
  elseif msg=="getall()" then
    --alllog forwarding
    --今度は今まで受信したすべてのメッセージを返す
    --動作自体はさっきの部分と同じ
 
    --alllog message load
    alllogfile=io.open("/alllog","r") 
    alllogmsg=alllogfile:read("*a")
 
    --message send
    while b==false do
      print("sending...")
      rednet.send(SEND_ID,alllogmsg)
      id,msg=rednet.receive(2)
 
      if msg=="stop()" then
b=true
      end
    end
 
    --今回はランプの動作はしないんだよ
    --ログも消す必要ナッシング
 
  else
    --write message to log
    --ログファイルに受信したメッセージを書き込む
    
    --sign on
    rs.setOutput("left",false)  --受信ランプ on
 
    --get minecraft day&time
    --マイクラ内時間の取得。それっぽくね
    time=os.time()  --時間取得
    time=textutils.formatTime(time,flase)  --書式設定
    day=os.day()  --日にち取得。過ごした日数
 
    --write message to file
    --ここで書き込む書式を決めてやってから書き込む
    str_date="date:"..day..","..time.."\n"
    str_msg="id:"..id.."\nmessage:"..msg.."\n"
    str_line="----------------------------\n"
 
    --writing!
    --最初に作った関数を使って書き込む
    --まずはlogのほうから
    filewriter("/log",str_date)
    filewriter("/log",str_msg)
    filewriter("/log",str_line)
 
    --alllogにも書き込み
    filewriter("/alllog",str_date)
    filewriter("/alllog",str_msg)
    filewriter("/alllog",str_line)
 
  end
end
 


ソースコード以上。

もし間違いがあったら遠慮なくコメント欄へ「ここ間違ってるわハゲ!」ってコメントください。
もしそっちの間違いだったらこっちから「間違ってへんわハゲ!」って返すけど。



後回しになったレッドストーントーチのお話な。

rs.setOutput("出力方向",true or false)でレッドストーン回路の出力ができる。

今回、レッドストーン回路がサーバー機の左側にあるから、出力方向はleft。

で、trueとfalseだが、単純にonとoff。このへんはレッドストーントーチの特性みたいなもんを使ったアレなわけだが、スイッチとか使って一応説明しとく。


rs.setOutput("left",true)の状態がこれ


2013-01-31_08.29.54.png






で、rs.setOutput("left",false)の状態がこれ


2013-01-31_08.29.46.png







スイッチがパソコンに変わっただけ。ということ。



で、最後。起動したときにこのプログラムを立ち上げるように設定したかったら設定するといい。

最初に編集したstartupに以下を追加

shell.run("pop_server")

これでマシンが起動したら自動的にプログラムが動作してメール受信待ち状態になる。



動作確認の方法だが、メインマシンで lua て打つとluaが立ち上がる。
ここで、コマンドをいくつか打つと確認ができる。

今回はサーバーIDが28だからそれで行くけどそのへん臨機応変に。

・メッセージ送信
  rednet.send(28,"test")

・未読メッセージ受信
  rednet.send(28,"get()")
  rednet.receive()
  rednet.send(28,"stop()")

・全メッセージ受信
  rednet.send(28,"get()")
  rednet.receive()
  rednet.send(28,"stop()")



ということでメール受信サーバー設置編は以上。

このままではまだ不便ということで、次はメインマシンで使うメールクライアントを作るよ。
 
メール受信サーバー作ったった(クライアント作成編)へ続く


PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
copy love ring cartier
This post is giving me a stomach ache…lol. “Find a way to make it pay”…I think I’ll write that down and go to sleep. zzzzzzz……
copy love ring cartier URL 2017/09/09(Sat)22:04:10 編集
cartier necklace love copy
magnificent submit, very informative. I ponder why the opposite specialists of this sector don’t realize this. You should continue your writing. I’m sure, you’ve a huge readers’ base already!
cartier necklace love copy http://www.wdsav.com/category/fake-cartier-necklace
cartier necklace love copy URL 2017/09/13(Wed)15:25:48 編集
van cleef alhambra bracelet copy
По-моему пора сделать склейку глав на тома для удобства скачки одним файлом.
van cleef alhambra bracelet copy http://www.howtobuybangles.com/
van cleef alhambra bracelet copy URL 2017/11/09(Thu)10:52:15 編集
cartier love necklace pink gold fake
I’m doing a dialectical in social 30 about whether fast food is at fault for obesity rates.thanks for the info guys.
cartier love necklace pink gold fake http://www.brandjewelryreviews.net/tag/cartier-necklace-replica
カレンダー
10 2017/11 12
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
カウンター
プロフィール
HN:
Mugen
性別:
男性
職業:
社会人だよバカヤローー!!
趣味:
ピアノ、アニメ・音楽鑑賞、ネットサーフィンとかとか
自己紹介:
ただの車好きな変態です。

twitterもやってますんで、よければリンクからドゾー
Twitter




最新CM
[11/18 OmYAdminia]
[11/16 Jerryatorn]
[11/15 Scottzet]
[11/11 ブランド激安市場]
[11/09 cartier love necklace pink gold fake]
バーコード
最新TB
(10/02)
ブログ内検索
アクセス解析
忍者ブログ [PR]