اعتبار سنجی ورودی در Phoenix


#41

تا جایی که اطلاع دارم بعد از مصارف اولیه که برای راه اندازیش احتیاج هست این مقدار رم در اختیار میمونه ، مودم داریم 400 کیلوبایت یا یگ مگابایت کلا رم داره و روش jvm هم داره مثل گل و بلبل کار میکنه و همین الانم روی چندتاشون برنامه هایی با 5 هزار خط کد کار میکنه :blush:
https://uk.farnell.com/cinterion/tc65i/mod-gsm-gprs-quad-band-tcp-ip/dp/1718877
این همون مودم قبلی که میگم هست که با مصیبت قانع شدند عوضش کنند ، مشخصاتش رو بخونید تا متوجه بشید چه خون دل هایی خوردم و چه عذاب هایی کشیدم :rofl::rofl:
عزیز ایستگاهها در کوه و بیابون وصل میشن جایی که سیم کارتی وجود نداره شبکه ای اینترنتی وجود نداره و یه روند خیلی طولانی و دراز طی میکنند تا بیان برسن به نت که در قسمتی phoenix نقش خاص خودش رو داره که البته اونم چون روی http هست یکم داده زیاد مصرف میکنه و اونم شاید بعدا روی خود tcp بیاریم و پروتوکل خودمون رو بنویسم ، ارلنگ تو صنعت هم استفاده داره و قرار نیست فقط در مخابرات باشه اما شما محدوش میکنید به اکتو :cold_sweat::cold_sweat::grimacing:


#42

کاربرد Beam و JVM با هم متفاوته,
من محدودش نکردم به Ecto, شما الان اطلاعات جدید دادی.


#43

بله درسته و برای همین BeamVM رو انتخاب کردیم چون واقعا کار ما رو راحتتر کرده ، قبلا در جاوا میخواستم به دوتا پورت کام وصل بشم دمار از روزگارم در می آورد اما الان همین کار رو تو الکسیر به راحتی میکنم اونم نه با دوتا بلکه با بیشتر از گاهی اوقات 10 تا و تاخیرش و دردسرش و زحمتش و … به قدری کمه که عملا بهترین گزینه هست


#44

با pattern matching قدرتمند BeamVM هر validation ی انجامپذیره


#45

من سوالی که پرسیدم این بود و دوست دارم بدونم شما درهمچین موقعیتی قرار بگیرین چیکار میکنید ؟ آیا چون نمیتونین از اکتو استفاده بکنید کلا الکسیر یا phoenix رو ول میکنید میرید سراغ یه گزینه بعدی چون از اکتو نمیتونین استفاده بکنید ؟


#46

اکتو به Phoenix ربطی نداره.
من سعی میکنم تا وقتی لازم نیست از چیزی استفاده نکنم اما بستگی به شرایط داره


#47

دقیقاً

> case Map.take(params,["age","name"]) do
> 	%{"name" => nil,"age" => nil} -> :both_nil
> 	%{"name" => "","age" => ""} -> :both_empty
> 	%{"name" => nil} -> :name_nil
> 	%{"age" => nil} -> :age_nil
> 	%{"name" => ""} -> :name_empty
> 	%{"age" => "" } -> :age_empty
> 	%{"age" => age,"name" => name} when age in 12..100 and name != "" -> IO.puts "okay"
> 	_ -> IO.puts "err"
> end

این چیزیه که برای سوال بالا خودم نوشتم
خب شما جای من باشین از این پترن مچینگ برای همچین موقعیتی چجوری استفاده میکنید ، داخل تابع ها با گارد یا با چی ؟ من به اون تجربه فانکشنال شما احتیاج دارم تا بتونم بهترین کد رو بزنم :blush:


#48

شما در فانکشنال به مراتب قوی تر از من هستید ، دقیقا بخاطر دارم دورانی که من نمیتونستم الف رو از ب تشخیص بدم از شما در مورد علاقه شخصی خودتون سوال کردم و برنامه نویسی فانکشنال رو در جواب من به گفتین ! الانم میخوام بدونم چجوری از پترن مچینگ برای همچین چیزی استفاده میکنید تا کدهای خودمو با اون وفق بدم


#49

من مشکلی با این روش ندارم, اما اگر یک فانکشن برای validate کردن داشته باشی بهتره


#50

اینم به دل خودم نمیچسبه یه ماژول دیگه دارم مینویسم که تمام مقدارهایی که “” هستن یا nil یا قراره trim بشن و … رو تمام تبدیل به nil کنه تا از حجم پترن مچینگ کم کنم و … فکر کنم انقدر پیش برم آخرش یه کتابخونه بشه :rofl::rofl::rofl::rofl::rofl::rofl::rofl::rofl:
بخدا بفهمی این کارها رو با چه قیمت مسخره و کمی صرفا بخاطر علاقه میکنم با چک میخوابونی گوشم

میشه در مورد این یکم بیشتر توضیح بدی


#51

من بودم چندتا فانکشن می نوشتم اگر تعداد پارامتر ها کم هستند.

منظور

def make(conn,%{“age” => age,“name” => name} = params) do

def make(conn,%{“name” => name} = params) do

def make(conn,%{“age” => age} = params) do

هست


#52

فکر خوبیه اگر option به صورت error و ok هم داشته باشه، یعنی از option pattern استفاده کنیم

{:ok, result}
{:reason, error}

و

:none
{:some, result}

بستگی به مورد استفاده داره که روش اول یا ترکیبی از هر دو برای شما مناسب بنظر میاد. خورنده خروجی validation باید بر اساس اتم های ok, some, none و error عمل کنه و میتونی از فلسفه let it crash هم بهره ببری کنی.

case Love.validate(heart) do
  {:ok, result}    -> # this is the person you’d like to marry 
  {:error, reason} -> # print  
end

#53

اگر مشکلی هم در ارور پیش اومد که خود تابع ارور نمی ده می تونید از raise هم استفاده کنی .


#55

کاملا مخالفم!:smiling_imp: error باید حتما وجود داشته باشه چون قرار شد تابع validate از پترن option پیروی کنه، این یعنی حالت سومی وجود نداشته باشه.

image


#56

بلخره توماج جان برخی موارد واقعا آدم نیاز داره کارش سریع پیش بره و هرچی سرچ می زنه متاسفانه مورد خوبی پیدا نمی کنه به نظرم raise می تونه گزینه خوبی باشه

بمب ساعتی رو یادتونه پست زده بودم تو انجمن الکسیر :grinning:

بهم اونجا پیشنهاد داده بودند


#57

متوجه هستم استاد اما در این مورد نمیتونه درست باشه چون مقدار validate فقط ok و error هست،


#58

ایشون نمی خواد فقط یک مپ رو درست کنه توماج جان ایشون فرایند بیشتر از اینارو می خواد . یعنی علاوه بر نیل نبودن و … می خواد چک کنه این عدد یا استرینگ و … موارد دیگه یعنی چیزی که الان گفتن ظاهر موضوع هست که مشکل اولشونه . ورگنه برگشت ارور شما می فرمایید بهترین کاره و منم همیشه همین راه رو می رم جلوی استاد جان


#59

مپ در مثال من فقط برای option هست، من هیچ مشکلی با raise ندارم اما نه در مثال case، اگر منظورت در متد validate باشه خیلی هم خوبه، خودم هم اشاره کردم که let it crash


#60

این رو بالا گفتم که به درد من نمیخوره ، شروع دوباره برنامه حداقل چند ثانیه زمان میبره و برنامه crash بشه تا به خودش بیاد کلی داده از دست رفته ، اینطوری یک جریان دارم اما برنامه crash بشه دارای دوتا جریان میشه ، یکی داده هایی که بعد از شروع برنامه در حال ذخیره شدن هستند و یکی هم داده هایی که وقتی برنامه از کار افتاد ذخیره شده بودن ، کار کردن با این دوتا جریان وقت و اعصاب زیادی میخواد و اصلا مقرون به صرفه نیست ، برای همینم هست که دنبال یک اعتبار سنجی خیلی خیلی قوی ام که احتمال خطا رو تقریبا نزدیک به صفر بکنم ! هر بار از کار افتادن برنامه برای ما کلی خرج و مخارج داره و یک بار مجبور شدم امتحان ها رو بزنم زمین برم یه استان دیگه ، از اونجا دوباره بریم تو کوه بالای دکل 30 متری سنسور ریستارت کنیم :smile: منم دوست داشتم روی یه ماشین با کانفیگ خیلی بالا برنامه اجرا بشه اما در صنعت متاسفانه گزینه ها دست خود آدم نیست ، چند صدتا ایستگاه هست و بخوان برای تک تک اینها ماشین هایی با کانفیگ بالا بخرن و تک تک اینها رو برن تو کوه و جنگل بروز رسانی کنند براشون کلی هزینه داره ، برنامه از کار بیافته باید بریم دستی ریستارت کنیم، بعضی ایستگاهها هستند بعضی از ماشین هاشون ماژول gsm داره ، تو اینها crash شدن برنامه هزینه زیادی داره و دستگاهها بقدری قراضه ان که هنگ کنن نیم ساعت میکشن به خودشون بیان


#61

شهریار جان این گزینه رو هم زیاد زدم متاسفانه در مورد داده های تو در تو بیش از اندازه پیچیده میشه :

    sensor state = %{
    "restartLogger" => 0x65520,
    "out_of_range" => 0x65555,
    "error_value" => 0x...
    ....
    }
    %{"data" => %{"resp" => {110,120,98,85},"sensor_state" => list_of_state},
    "binary_data" => ...}

حالا گزینه ای بنام متا پروگرمینگ هم هست و فکر کنم باید یه ماژول جداگانه سبک برای این کار بنویسم