![](https://academy.hsoub.com/uploads/monthly_2016_06/576880c0d10bf_HOTBalloonTrip_UltraHD.jpg.69f847157309830770b9ef4f80c0a654.jpg)
E.Nourddine
-
المساهمات
1458 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
18
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
أجوبة بواسطة E.Nourddine
-
-
-
للسماح لك باستعمال AddNew على BindingListالخاصة بـ BankAccount عليك التوفر على خاصية New الخاصة بـ Constrctor، كما هو موضح في الكود التالي:
Public Class BankAccount Public Property BSB As String Public Property Account As String Public Sub New() 'Do initialization here if you need 'Or Remove the constructor if you don't need any initialization. End Sub End Class
كما أنك لن تحتاج لاستعمال accountList.AllowNew = True، يكفي أن تستعمل(BindingList(Of T ) كـ DataSource:
Private accountList As BindingList(Of BankAccount) Private Sub frmAccountLoad_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load accountList = New BindingList(Of BankAccount) dgvAccounts.DataSource = BS End Sub
إذن يمكنك استعمال()accountList.AddNew في أي مكان تريد من الكود:
-
جملة الاستعلام المستعملة في كودك السابق، وجب أن تكون على الشكل التالي:
Dim con As dbConn = New dbConn() Dim SqlSelect As String SqlSelect = "SELECT * FROM login Where user_id= @parmUserID" Dim cmd As New OleDbCommand(SqlSelect, con.oleconnection) cmd.Parameters.AddWithValue( "parmUserID", WorkerID_.Text )
بالنسبة للمتغير النصي InsertSQL والذي يحتوي على جملة استعلام تأخذ قيمها من خلال القيم الموجودة بالحقول النصية، أنصحك باستخدام هذه الطريقة في ربط Values بجملة الاستعلام مع الحقول النصية، هذه أوضح وأكثر تنظيما من طريقتك المُستعملة والتي تعتمد على Concatenation، بهذا الشكل:
Dim InsertSQL As String InsertSQL = "INSERT INTO login (user_id, user_role, user_password, user_status) " InsertSQL &= " VALUES ( @parmUser, @parmRole, @parmPwd, @parmStatus )" Dim cmdInsert As New OleDbCommand(InsertSQL, con.oleconnection) cmdInsert.Parameters.AddWithValue( "parmUser", WorkerID_.Text ) cmdInsert.Parameters.AddWithValue( "parmRole", "Worker" ) cmdInsert.Parameters.AddWithValue( "parmPwd", "12345" ) cmdInsert.Parameters.AddWithValue( "parmStatus", 1 ) Dim SqlUpdate As String SqlUpdate = "INSERT INTO Worker (ID, WorkerID, WorkerName, DoB, Address, Phone, Email, CompanyName, PassportNum, PassportExp, VisaExp, VisaStatus, user_id) " SqlUpdate &= " VALUES ( @parmID, @parmName, @parmDoB, etc... ) " Dim cmdUpdate As New OleDbCommand(SqlUpdate, con.oleconnection) cmdUpdate.Parameters.AddWithValue( "parmID", WorkerID_.Text ) cmdUpdate.Parameters.AddWithValue( "parmName", WorkerName.Text ) cmdUpdate.Parameters.AddWithValue( "parmDoB", DoB.Text ) -- etc with the rest of the parameters.
-
هناك ثلاث طرق لاستخدام Web Service على بيئة التطوير Vb.net:
استعمال String:
وهي أن تحليل المدخلات كقيمة نصية، ثم تتفحصها، مثال:
[WebMethod] public bool ImportXML(string xmldoc) { /*XML تحليل القيم النصية وتحويلها إلى كائنات */ }
ربطها بـClass:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <SubmitClass xmlns="http://msdn.microsoft.com/AYS/XEService"> <input> <child1>foo</child1> <child2>bar</child2> </input> </SubmitClass> </soap:Body> </soap:Envelope>
مثال:
public class MyClass { public string child1; public string child2; } [WebMethod] public void SubmitClass(MyClass input) { // Do something with complex input parameters return; }
استعمال XmlElement:
[WebMethod] public void SubmitXml(XmlElement input) { return; }
للاستفادة حول الموضوع أكثر Msdn.
-
من الواضح أن اسم Id كحقل غير معترف به من قبل dt، لذا وجب عليك استعمال أسماء حقول صحيحة متواجدة بقاعدة البيانات، حتى لا تقع في هذا الخطأ، مثل:
dr("Product ID")= dr("Product Name")= dr("Price")= dr("Quantity")=
أو يمكننا استعمال القيم الترتيبية للحقول:
dr(0)= dr(1)= dr(2)= dr(3)=
ومن وجهة نظر، أن تستعمل هذه الطريقة لربط قيم DataGridView [قيم لحقول نصية من نوع TextBox، بهذا الشكل:
If Trim(txt_qty.Text) = "" Then MsgBox("Please insert quantity") Else Dim rnum As Integer = datagridviewname.Rows.Add() datagridviewname.Rows.Item(rnum).Cells("name_of_productid_column").Value = txt_id.Text datagridviewname.Rows.Item(rnum).Cells("name_of_productname_column").Value = txt_name.Text datagridviewname.Rows.Item(rnum).Cells("name_of_price_column").Value = txt_price.Text datagridviewname.Rows.Item(rnum).Cells("name_of_qty_column").Value = txt_price.Text End If
-
هذه بعض الروابط المفيدة في مجال تعلم Node.js
دروس:
- دروس على أكاديمية حسوب
- NodeSchool.io interactive lessons
- The Art of Node (an introduction to Node)
- Hello World Example
- Hello World
- Hello World Web Server
- Node.js guide
- Build a blog with Node.js, express and MongoDB
- Node.Js Tutorials At Project 70
- Node.js for Beginners
- Learn Node.js Completely and with Confidence
- Absolute Beginners Guide To Node.js
- Node JS Processing Model – Single Threaded Model with Event Loop Architecture
فيديوهات:
- http://nodetuts.com/
- Introduction to Node.js with Ryan Dahl
- Node.js: Asynchronous Purity Leads to Faster Development
- Parallel Programming with Node.js
- Server-side JavaScript with Node, Connect & Express
- Node.js First Look
- Node.js with MongoDB
- yan Dahl's Google Tech Talk
- Real Time Web with Node.js
- Node.js Tutorials for Beginners
- Pluralsight courses
كتب:
-
على برنامج photoshop، وكما هو الأمر على مختلف برامج Adobe المخصصة للتصميم، يتيح رسم أشكال shapes بمميزات مختلفة، ومن بين الإعدادات التي يرتكز على كل مصمم ما يدعى بـ Stroke الإطار وَ Fill الملء، حيث بالإمكان التحكم في كلا الخاصيتين.
في حالتنا هذه سنستعمل خاصية الملء Fill وهي المسؤولة عن ضبط محتوى الشكل، كما تبين الصورة التالية:
بعد تحديد الشكل، ومن خلال القائمة العلوية الخاصة بإعدادات الشكل، توجد خاصية Fill، سنختار قيمة بدون محتوى حتى نحصل على شكل بدون محتوى.
-
الطريقة التي سننهجا للوصول إلى نتيجة المعادلة الكيميائية هي:
(income + income => outcome) H2 + O2 => H2O
أي أن جملة الاستعلام ستكون على الشكل:
SELECT CONCAT(GROUP_CONCAT(CASE WHEN type='income' THEN CONCAT(IF(num=1, '', num),substance) END SEPARATOR ' + '), ' => ', GROUP_CONCAT(CASE WHEN type='outcome' THEN CONCAT(IF(num=1, '', num),substance) END SEPARATOR ' + ')) AS reaction FROM tbl_reaction_item GROUP BY reid;
تم استعمال GROUP By للتجميع الحقول حسب حقل معيّن.
النتيجة النهائية للمعادلة:
╔══════════════════╗ ║ reaction ║ ╠══════════════════╣ ║ 2H2 + O2 => 2H2O ║ ╚══════════════════╝
استخدمنا:
- GROUP_CONCAT مع علامة + للحصول على الشكل العلمي لكتابة المعادلة.
- CONCAT للحصول على الرمز <=.
╔══════╦═══════════╦═════════╦═════╦══════╗ ║ reid ║ substance ║ type ║ num ║ pos ║ ╠══════╬═══════════╬═════════╬═════╬══════╣ ║ 1 ║ H2 ║ income ║ 2 ║ 1 ║ ║ 1 ║ O2 ║ income ║ 1 ║ 2 ║ ║ 1 ║ H2O ║ outcome ║ 2 ║ 1 ║ ╚══════╩═══════════╩═════════╩═════╩══════╝
النتيجة النهائية:
╔═════╦════════════╦═════════════╦══════════╦══════════════════╗ ║ id ║ condition ║ phenomenon ║ infor ║ reaction ║ ╠═════╬════════════╬═════════════╬══════════╬══════════════════╣ ║ 1 ║ abcd123 ║ abcd123 ║ abcd123 ║ 2H2 + O2 => 2H2O ║ ║ 2 ║ wer ║ wer ║ wer ║ (null) ║ ╚═════╩════════════╩═════════════╩══════════╩══════════════════╝
-
أولا عليك ببداية حلقة التكرار بالعدد 1 وليس 3 لأنك تريد البدء بـ Number 1.
و استعمالك لـ
$num$i
دون اللجوء إلى رابطة concatenation وهي النقطة "." سيتسبب في رفع استثناء exception.
وتكون الطريقة الصحيحة لفعل ذلك، كما يلي:
$num1 = "Number 1"; $num2 = "Number 2"; $num3 = "Number 3"; for ($i = 1; $i <=3; $i++) { $num = 'num' . $i; echo ${$num} . "<br>"; }
أو:
<?php $num1 = "Number 1"; $num2 = "Number 2"; $num3 = "Number 3"; for ($i = 0; $i < 3; $i++) { echo ${"num".$i} . "<br>"; }
يمكن الحصول على نفس النتيجة، باستعمال مصفوفة تخزّن فيها القيم المناسبة للمتغيرات، ثم تتصفحها عن طريق حلقة التكرار for:
$nums = array("Number 1", "Number 2","Number 3"); for ($i = 0; $i <3; $i++) { echo $nums[$i] . "<br>"; }
-
الخطأ الوحيد في كودك هو استعمالك لـ absoulute عوض relative.
عملت على تصحيح الكود ليكون بالشكل التالي:
.bodyContent { position:relative; padding:20px; margin-bottom:50px; } .footer { position: relative; background-color:#333; width:100%; height:50px; margin-bottom:0px; }
خاصية position في ملف التنسيق css تتعلق بتموضع العنصر داخل العنصر المحتوي له، وتمتلك أربع قيم من الممكن أن تأخذها كقيم:
static
relative
fixed
absolute
-
بالرغم من أن العنصر مخفي إل أنه يمكن الحصول على عرضه -height- من خلال مكتبة Jquery، وذلك من خلال الشفرة التالية:
var previousCss = $("#myDiv").attr("style"); $("#myDiv") .css({ position: 'absolute', //تتضمنها من قبل #myDivهذه الخاصية يمكن الاستغناء عنها في حال كانت visibility: 'hidden', display: 'block' }); optionHeight = $("#myDiv").height(); $("#myDiv").attr("style", previousCss ? previousCss : "");
ويعتبر المتغيّر optionHeight، كمتغير يحتوي على قيمة Height الخاصة بـ myDiv#.
-
- يمكنك الاستعانة بوسم Strong للحصول على كلمة أو جملة تتميز بتأثير Bold.
مثال:
<strong>حسوب</strong>أكاديمية
- الطريقة الثانية لفعل ذلك، استعمال خاصية تنسيق font-weight :
span { font-weight: bold; }
<span>أكاديمية حسوب</span>
-
<% @post.each do |p| %> <%= p.jpost_title %> <%= p.company.company_name %> <%= p.post_location %> <% end %>
عليك استعمال delegate في رابط الجدولين، بهذا الشكل:
#app/models/post.rb class Post < ActiveRecord::Base belongs_to :company delegate :company_name, to: :company #-> @post.company_name end
مما يسمح لك باستخدام:
<% @post.each do |p| %> <%= p.jpost_title %> <%= p.company_name %> <%= p.post_location %> <% end %>
وحتى أضعك في الصورة بشكل وجيد، أظر إلى الرسم التالي المبين لبنية الجداول-كمثال- داخل قاعدة البيانات:
post.company@ وجب التأكد من استعمال رابط بين الجدولين.
يمكن الوصول إلى company عن طريق id ومن ثم اسنخراج جميع معلوماتها:
للحصول على نتيجة عند استعمال post.company@ يجب التأكد من استعمال رابط بين الجدولين.
يمكن الوصول إلى company عن طريق id ومن ثم استخراج جميع معلوماتها:
@post.company_id #-> 1 @post.company.company_name #-> "Test"
-
لتوضيح المفهوم فـ after_create تعمل بعد حدث إدخال بيانات إلى قاعدة البيانات.
و في كود الحقل name لم يتم تخزينه بعد:
user = User.create(some_attiributes) user.name #=> "Test name" user.reload user.name #=> nilمما يحتم إعطاءه القيمة
في حال أردت إدخال قيمة name في قاعدة البيانات استعمل before_create والتي تعمل عكس الوظيفة السابقة أي قبل عملية التخزين في db.
مثال، لنفترض وجود حقلين first_name و last_name:
before_create :set_user_full_name def set_user_full_name self.name = "#{first_name} #{last_name}" end
كحالة من الممكن الوقوع فيها، وهي عدم توفر المستخدم على قيم لـ fisrt_name و last_name، يمكننا استخدام الكود التالي لتفادي أي نوع من رفع excepton من خلال المتحكم Controller:
class Users::RegistrationsController < Devise::RegistrationsController before_filter :set_name_param, only: [:create] private def set_name_param params[:user][:name] = "#{params[:user][:first_name]} #{params[:user][:last_name]}" end end
-
من أساسيات الحياة أنّ الإنسان لا يمكن أن يمضي يومه بأكمله في العمل، وإن صادف ووجدت شخصا يعمل بشكل متواصل طيلة اليوم فاعلم أنه سيصاب بنوبة من الإرهاق والتعب من المجهود المبذول، وذلك لأنه يعمل بطريقة ستوصله إلى أقرب مستشفى لتلقي العلاج، لذلك ينصح المتخصصون في هذا المجال بضرورة الموازاة بين العمل والراحة، وكطريقة أجدها فعالة بشكل جيد -من خلال تجربة شخصية-، طريقة POMODORO، حيث تعتمد هذه التقنية على مبدأ أساسي بسيط:
- أعمل 25 دقيقة وخذ مدة راحة تساوي 5 دقائق.
- ثم أعد العملية بشكل متواصل إلى أن تنتهي ساعات العمل.
خلال 5 دقائق، يمكنك الذهاب إلى الحمام، أو إعداد كوب القهوة خاصتك، أو المشي في أرجاء مكتبك لتنشط دورتك الدموية، وتخرج من روتينية العمل.
هذا ستجدد نشاطك وتبقى حيوياً لوقت أطول مما يساعدك على الاستمرار في العمل بشكل أفضل.
بالنسبة لـ POMODORO يمكنك اقتناء هذا المؤقت الذي سيساعدك على ضبط أوقات العمل والراحة:
-
1
-
في العموم ليس هناك وقت محدد لرفع السعر، بمعنى آخر لن يقدّر أحد سواك الحاجة والوقت المناسب لفعل ذلك، حيث أنّه مغامرة يجب حساب عقباتها جيداً قبل الإقدام عليها، فمثلاً من الممكن أن تفقد عميلاً مهما بسبب هذه الزيادة إذا لم يلمِس في عملك الأحقّية للسعر المعروض مقابل الساعة الواحدة، أضف إلى ذلك إمكانية مصادفة نوع من العملاء مستعد للمجادلة في أي شيء وبالتحديد في السعر.
كوقت أعتبره مناسبا لرفع السعر بشكل تقريبي - وهنا لن أتحدث عن مهارتك، سأعتبرك ماهراً ومحترفا في عملك - فهو وقت زيادة الطلب على العرض أي عندما تشعر أن هناك إلحاحا على طلبك للعمل وأنك بصدد العمل على مشروعين أو أكثر، يمكنك هنا رفع سعر ساعتك، مع مراعاة أن تكون درجة رفع السعر معقولة وغير مبالغ فيها، حيث ستضع حداً للمتلاعبين في عرض المشاريع وتعمل مع الجادين. ولا تنسى المحافظة على العملاء المداوِمين على العمل معك، فتجعل رفع السعر هو الغاية القصوى من عملك فتفقد عملاءك المخلصين للعمل معك.
-
1
-
-
عادة ما تكون هذه المبيانات غرض عرض تقارير ومبيانات للمستخدم، حتى يتمكن وبصورة واضحة من استنباط الفرق بين قيم ومعايير بخصوص ظاهرة معينة أو نتائج وإحصائيات في مجال ما.
كهذه المبيانات مثلاً:
ملاحظة: وظيفة المبيانات هي تسهيل استنتاج وإيصال المعلومة، بشكل هندسي جميل.
تيقى وسيلة عرض مثل هذا النوع من التقارير على العميل، تختلف من مستقل لآخر:
استعمال Balzamiq كبرنامج عرض وتصميم شكل التطبيق، حيث يوفر إمكانية عرض chart data أي المبيانات، كمثال:
والطريقة الثانية، والتي ستتطلب منك بعض الوقت و احتراف أحد برامج التصميم-وأنا لست مع هذه الطريقة-، حيث ستقوم بتصميم مبيانات بقيم عشوائية غرض عرضها للعميل.
يلجأ غالبية المطورين إلى استعمال صور لمبيانات موجودة على النت لإعطاء العميل صورة تقريبية، ¦أو استعمال برنامج Balzamiq كما ذكرت من قبل.
-
هذه بعض مميزات البرامج الأكثر استعمالاً :
Adobe Premiere Pro:
- مقاطع الفيديو والصوت معا...
- دمج الفيديو أو الصوت (Mix).
- تصحيح الألوان.
- إضافة تأثيرات متنوعة، animation،...
- سهل الاستعمال.
Adobe After Effects:
- متخصص بالأساس في إضافة التأثيرات الخاصة.
- إضافة مجسمات 3D.
- إضافة أي تأثيرات 2D من الممكن تخيلها.
- تصحيح الألوان.
Vegas Pro:
- دمج الفيديو أو الصوت (Mix).
- به العديد من مميزات Adobe Premier ولكن ليس كلها.
- به العديد من مميزات Adobe After effects ولكن ليس كلها.
- سهل الاستعمال.
-
هذه بعض المحررات الخاصة بالفيديو، هناك الكثير وهذه أفضلها:
VLMC: هو برنامج مهيكل بالأساس على برنامج VLC،ويقدم إمكانيات جيدة، هذا بالإضافة إلى أنه برنامج مفتوح المصدر، ويمكن من تحرير قطع فيديو عديدة.
Lightworks : برنامج حديث، يمتلك مميزات تحرير الأشرطة ويتميز بإمكانية حفظ الفيديو بصيغة AVI.
Avidemux: محرر فيديوهات بسيط، يُنصح به للتغيرات الطفيفة والسريعة.
Kdenlive: محرر بمميزات كبيرة ، وهو مفتوح المصدر أيضا يمكن تنصيبه على بيئة Linux وماك أو اس.
-
في النسخة الحديثة من FFmpeg، استعمل crop filter.
عن طريق
ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4
حيث :
- out_w: هي عرض المستطيل الناتج.
- out_h: طول المستطيل الناتج.
- xو y :إحداثيات النقطة الأعلى جهة اليسار للمستطيل الناتج، أي نقطة بداية عملية القص.
الصورة الأصلية(320x240):
مثال1:
لقص 60*80 ابتداءً من النقطة(200،100):
ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4
مثال2:
لقص الجزء السفلي جهة اليمين:
ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4
أو:
ffmpeg -i in.mp4 -filter:v "crop=320/2:240/2:320/2:240/2" -c:a copy out.mp4
أو:
ffmpeg -i in.mp4 -filter:v "crop=240:120:240:120" -c:a copy out.mp4
مثال3:
قص وإزالة 20px من أعلى الشريط و20أخرى من أعلاه:
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4
-
1
-
إذا كنت تريد جعل النص المحدد بمحاذاة اليمين، يمكنك استعمال الخاصية "HorizontalContentAlignment="Right وذلك داخل وسم Combobox، بهذه الطريقة:
<ComboBox ... HorizontalContentAlignment="Right">
وفي حال كنت تريد جعل محاذاة عناصر القائمة المنسدلة إلى اليمين يمكنك استعمال خاصية HorizontalContentAlignment الخاصة بعناصر القائمة ComboBoxItems:
<ComboBox> <ComboBox.ItemContainerStyle> <Style TargetType="{x:Type ComboBoxItem}"> <Setter Property="HorizontalContentAlignment" Value="Right"/> </Style> </ComboBox.ItemContainerStyle> </ComboBox>
ولضبط محاذاة العنصر المحدد داخل القائمة فقط إلى اليمين، نستعمل:
<ComboBox ... HorizontalContentAlignment="Right"> <ComboBox.ItemContainerStyle> <Style TargetType="{x:Type ComboBoxItem}"> <Setter Property="HorizontalContentAlignment" Value="Stretch"/> </Style> </ComboBox.ItemContainerStyle> </ComboBox>
-
الطريقة السهلة لفعل ذلك هي بتصميم إطار Stroke لدائرة على شكل خطوط Dashed Line، وذلك من خلال نافذة Stroke Panel:
الطريقة الثانية والتي أراها مركبة نوعا ما بالمقارنة مع الطريقة الأولى، وهي رسم خط ثم تكراره بشكل دائري، مما يتح لنا الحصول على نفس النتيجة:
رسم القطعة الأساسية:
من خلال القائمة Effect > Distort & Transform > Transform,
ثم نحدد Preview.
نكرر الشكل الأول بصورة دائرية، مما يتيح لنا الحصول على الشكل:
يمكن التحكم في المسافة الفاصلة بين شكلين متتابعين:
-
1
-
-
هناك طريقتين اثنتين لفعل ذلك:
- الأولى:
باستخدام الأمر التالي: Cmd+A, Cmd+C, Cmd+N.
عند إنشاءك لمشروع جديد ستظهر نافذة تحتوي على مقاسات widthو height المشروع، وهي أيضا مقاسات الطبقات المكونة للمشروع.
ملاحظة Cmd هي Ctrl على أنظمة ويندوز.
- الثانية:
يمكنك تحديد-عمل Selection- لطبقة ما أو جزء من المشروع عن طريق ضغط زر ctrl -أو Cmd- مع تحديد الجزء بالفأرة.
لتظهر المعلومات في نافذة أخرى -info panel-، يمكن إظهار هذه النافذة من خلال الاختصار F8:
-
يمكن إدراج تعليق في عدة أسطر على لغة البرمجة Python بالشكل التالي:
''' مرحبا بك في أكاديمية حسوب يمكنك اضافة عدد كبير من الأسطر واعتبارها كتعليق '''
التعليق في سطر واحد:
# تعليق مكون من سطر واحد
يمكن أيضا استعمال التعليقات بجانب الكود، مع العلم أن التعليقات لا يتم اعتبارها كود برمجي:
spam = 1 # تعليق بجانب الكود
-
1
-
كيف أغيّر عرض الإطار Stroke على Photoshop؟
في أسئلة التصميم
نشر
عند رسم أي شكل على برنامج Photoshop يمكن تعديل القيم الافتراضية للشكل عن طريق القائمة العلوية أسفل قائمة العناوين Menu، والتي تحتوي كل ما يخص بالشكل Shape،تمثلها الصورة التالية:
كما يمكن التحكم في عرض الخط عن طريق weight :
مما ينتج عنه: