10

Erlangを初めて使用したときに、あなたと最終的な解決策の間に生じた小さな問題をすべて知りたいだけです。

たとえば、これが私が持っていた最初のスピードバンプです:

  1. 複数のスレッドでスポーンする場合は、controling_process(Socket、Pid)を使用します。適切なスレッドへの適切なパケット。
  2. 別のサーバーとの通信を開始しますか?net_adm:ping('car @ bsd-server')を忘れないでください。シェルで。それ以外の場合、通信は行われません。
  3. Timer:sleep(10)、何もしたくない場合。デバッグ時に常に役立ちます。
4

7 に答える 7

5
  • 標準ドキュメントの参照方法を学習する

    OTP ドキュメントがどのように構成されているかを理解すると、探しているものを見つけるのがはるかに簡単になります (どのアプリケーションがどのモジュールまたはモジュールの種類を提供するかを知る必要があります)。

    sysまた、アプリケーションのドキュメントを閲覧するだけでも、多くの場合、非常にやりがいがあります。このようにしてdbg、非常に役立つコードをたくさん発見しましたtoolbar

  • シェル erlang とモジュール erlang の違い

    シェル erlang は、モジュール erlang とは少し異なる方言です。モジュール関数を定義することはできません (fun のみ)。レコード ( ) を操作するには、レコード定義をロードする必要がありますrr/1。匿名関数の観点から erlang コードを記述する方法を学ぶのはやや難しいですが、リモート シェルを使用して運用システムで作業するためには不可欠です。

    シェルと {start,spawn}_link ed プロセス間の相互作用を学習する - クラッシュする (例外を発生させる) シェル コードを実行すると、シェル プロセスが終了し、リンク先のすべてに終了シグナルをブロードキャストします。これにより、作業中の新しい gen_server がシャットダウンされます。( 「サーバー プロセスが消え続けるのはなぜですか?」 )

  • アーラン式とガード式の違い

    ガード式 (when 句) は Erlang 式ではありません。似ているように見えるかもしれませんが、かなり異なります。ガードは任意の erlang 関数を呼び出すことはできず、ガード関数 ( length/1、型テスト、element/2および OTP ドキュメントで指定されているその他のいくつか) のみを呼び出すことができます。ガードは成功または失敗し、副作用はありません。一方、Erlang 式は好きなことを行うことができます。

  • コードの読み込み

    コードのアップグレードがいつ、どのように機能するかを調べ、gen_server を最新バージョンのコールバック モジュールにアップグレードするための呪文 ( code:load(Mod), sys:suspend(Pid), sys:change_code(Pid, Mod, undefined, undefined), sys:resume(Pid).)。

    コード サーバー パス ( code:get_path/0) - ebin ディレクトリをコード検索パスに追加するのを忘れたことが判明した未定義の関数エラーに何度遭遇したか数えきれません。

  • アーランコードの構築

    emake (make:all/0およびerl -make) と gnu make の便利な組み合わせを考え出すには、かなり長い時間がかかりました (これまでに約 3 年:)。

    私の現在のお気に入りのメイクファイルはhttp://github.com/archaelus/esmtp/tree/masterで見ることができます

  • アーラン分布

    他のノードにアクセスできるようにするために、ノード名、DNS、Cookie、およびその他すべてを正しく取得しnet_adm:ping/1ます。これには練習が必要です。

  • リモート シェル IO の複雑さ

    group_leader()リモートノードで実行される呼び出しに渡すことを忘れないでくださいio:format。これにより、不思議なことに出力が消えるのではなく、シェルに表示されます (リモートシェル接続で使用すると、SASLレポートブラウザーには、出力の一部が間違ったノードに送信されるという問題がまだあると思いますrb)

于 2009-02-26T19:03:05.860 に答える
2
  • デバッグは大変です。私が知っているのは、コードで「error_logger:info_msg」への呼び出しを固執することだけです。
  • ドキュメントはむらがあります - それらは正しいですが、非常に簡潔です。
  • これは私自身のせいですが、eunit を理解する前にコーディングを開始したため、コードの多くは必要以上にテストが難しくなっています。
于 2009-02-27T15:14:55.930 に答える
1

Controlling_process()

複数のスレッドでスポーンする場合は、controling_process(Socket、Pid)を使用します。適切なスレッドへの適切なパケット。

于 2009-01-11T08:42:04.120 に答える
1

net_adm:ping()

別のサーバーとの通信を開始しますか? net_adm:ping('car@bsd-server') を覚えておいてください。シェルで。そうしないと、通信が行われません。

于 2009-01-11T08:42:35.960 に答える
0

タイマー:スリープ()

X ミリ秒一時停止します。

于 2009-01-11T08:43:43.853 に答える
0

理解するのに最も時間がかかったのは、関数呼び出しとメッセージ パッシングを中心にコードを完全に構築するというアイデアだけでした。残りの部分は、そこから抜け落ちた (スポーン、リモート ノード) か、新しい言語で学ばなければならない通常のこと (構文、stdlib) のように感じました。

于 2009-02-24T02:01:08.470 に答える