Saturday 18 November 2017

F # - moving المتوسط


ويكي كيفية تعلم موازين الغيتار موازين هي جزء أساسي من أي موسيقيين ذخيرة. أنها توفر لبنات بناء حاسمة لتكوين والارتجال في كل نمط تقريبا والنوع. أخذ الوقت لإتقان المقاييس الأساسية يمكن أن تجعل الفرق بين لاعب متوسط ​​وممتازة واحدة. لحسن الحظ، عندما يتعلق الأمر الغيتار، جداول التعلم هو عادة مسألة حفظ أنماط بسيطة من خلال الممارسة. خطوات تحرير الجزء الأول من أربعة: المفاهيم الأساسية والمصطلحات تحرير لديك بالفعل نظرية الموسيقية الأساسية قليلا تحت الحزام الخاص بك لا تتردد في تخطي إلى جداول أنفسهم من خلال النقر هنا. تعلم القراءة الفريتس من الغيتار. على الغيتار، والجزء الأمامي من الجزء الطويل، نحيف حيث كنت وضعت أصابعك يسمى لوحة الفريتس. المطبات المعدنية المطروحة على لوحة الفريتس تقسمها إلى حنق. يتم تشكيل جداول من خلال اللعب الملاحظات على أنماط مختلفة من الحنق، لذلك من المهم أن تكون قادرة على التعرف عليها. انظر أدناه: يتم ترقيم الحنق من غيض من الرقبة نحو الجسم من الغيتار. على سبيل المثال، الحنق في نهاية الرقبة هو الحنق الأول (أو الحنق 1)، الحنق التالي هو الحنق الثاني. وما إلى ذلك وهلم جرا. عقد أسفل سلسلة على حنق معين و سترومينغ سلسلة على الجسم من الغيتار يلعب ملاحظة. وكلما اقترب الحنق من الجسم، كلما ارتفعت الملاحظات. النقاط على الحنق هي للاشارة فقط أنها تجعل من الأسهل أن تعرف أين كنت وضع أصابعك دون الحاجة إلى الاعتماد على الحنق حتى الرقبة باستمرار. تعلم أسماء الملاحظات على لوحة الفريتس. كل حنق واحد على الغيتار يلعب مذكرة التي لديها اسم. لحسن الحظ، هناك فقط 12 تلاحظ الأسماء تكرر فقط مرارا وتكرارا. الملاحظات التي يمكن أن تقوم به هي أدناه. لاحظ أن بعض الملاحظات لها اسمين مختلفين: A، أب، B، C، سدب، D، ديب، E، F، F غب، G، غاب. بعد ذلك، تبدأ الملاحظات في A مرة أخرى وتكرر. تعلم مواقف مختلف الملاحظات هو شيء ليس من الصعب جدا، ولكن يستغرق وقتا طويلا قليلا جدا لتغطية في هذه المقالة. إذا كنت بحاجة إلى مساعدة، حاول مقالنا حول هذا الموضوع. تعلم أسماء السلاسل. يمكنك التحدث عن سلاسل مختلفة مع أسماء مثل سمكا، سمكا الثاني، وهلم جرا، ولكن من الأسهل بكثير لمناقشة جداول إذا كنت تعرف سلاسل الأسماء الصحيحة. هذا هو أيضا مفيد لأن يتم تسمية سلاسل بعد ملاحظة أنها تلعب عندما كنت لا تضغط على أي من الحنق. في الغيتار العادي من ستة سترينغ في الضبط القياسي، تكون السلاسل هي: 1 E (سمكا) A D G B E (أنحف) لاحظ أن هذا له نفس اسم السلسلة الأكثر سمكا، لذا فإن بعض الناس سيقولون منخفضا وعاليا E لنقول لهم بصرف النظر. يول أيضا في بعض الأحيان يرى e الصغيرة المستخدمة لسلسلة أنحف. تعلم مفهوم كامل ونصف الخطوات في نطاق. بعبارات بسيطة، مقياس هو مجرد تسلسل من الملاحظات التي تبدو جميلة عند تشغيلها في النظام. عندما نتعلم المقاييس أدناه، نرى جيدا أن جميع الجداول بنيت من أنماط الخطوات الكاملة ونصف الخطوات. هذا يبدو معقدا، ولكن هذه هي مجرد طرق لوصف مسافات مختلفة على لوحة الفريتس: 2 وهناك نصف خطوة هي مسافة الحنق واحد صعودا أو هبوطا. على سبيل المثال، إذا كنت تلعب C (سلسلة، الحنق الثالث)، والانتقال واحد حنق يصل تعطيك C (سلسلة، الحنق الرابع). يمكننا القول أن C و C هي خطوة واحدة على حدة. خطوة كاملة هي نفس الشيء إلا أن المسافة هي اثنين من الحنق. على سبيل المثال، إذا بدأنا في C ونقل اثنين من الحنق، وأيضا تلعب D (سلسلة، الحنق الخامس). وهكذا، C و D هي خطوة كاملة على حدة. درجات مقياس. كانوا على استعداد تقريبا لبدء تعلم جداول. المفهوم الأخير لفهم هو أنه منذ جداول هي تسلسل من الملاحظات التي من المفترض أن يكون لعبت في النظام، وتلاحظ على نطاق الحصول على أسماء مرقمة خاصة تسمى درجات لمساعدتك على التعرف عليها. وترد أدناه درجات. 3 تعلم اسم عدد لكل درجة هو الأكثر أهمية وتستخدم أسماء أخرى أقل في كثير من الأحيان. وتسمى المذكرة التي تبدأ على الجذر أو الأول. كما أنها تسمى أحيانا منشط. وتسمى المذكرة الثانية الثانية أو سوبيرتكونيك. وتسمى المذكرة الثالثة الثالثة أو المتوسطة. وتسمى المذكرة الرابعة الرابع أو سوبدينانت. وتسمى المذكرة الخامسة الخامسة أو المهيمنة. وتسمى المذكرة السادسة السادسة أو الفرعية. وتسمى المذكرة السابعة السابع لديها بضعة أسماء أخرى تتغير تبعا للمقياس، لذلك تجاهلها جيدا في هذه المقالة. وتسمى المذكرة الثامنة أوكتاف. كما أنها تسمى أحيانا منشط لأن لها نفس المذكرة كأول، أعلى فقط. بعد اوكتاف، يمكنك إما البدء من جديد من الثانية أو الاستمرار من التاسع. على سبيل المثال، يمكن تسمية المذكرة بعد اوكتاف التاسع أو الثاني، ولكن نفس المذكرة في كلتا الحالتين. ممارسة المقاييس لوني للشكل والسرعة. نوع واحد من مقياس أن من المفيد من منظور الممارسة هو مقياس لوني. في هذا المقياس، جميع الدرجات هي خطوة نصف منفصلة. وهذا يعني أن مقياس لوني يمكن أن يتم ببساطة عن طريق الذهاب صعودا وهبوطا في الحنق في النظام. حاول هذه ممارسة لوني: أولا، واختيار واحد من القيثارات سلاسل (لا يهم ما). بدء عد ثابت 44 فاز. تلعب اللدغة مفتوحة (أي ملاحظات فريتد) باعتبارها مذكرة الربع، ثم الحنق الأول، ثم الثاني، ثم الثالث. دون توقف، ولعب الحنق الأول، ثم الثاني والثالث والرابع. الحفاظ على فوز ثابت واللعب الحنق الثاني، ثم الثالث والرابع والخامس. استمر هذا النمط حتى تصل إلى الحنق ال 12، ثم عد إلى الأسفل على سبيل المثال، إذا كنت تلعب على سلسلة E عالية، فإن ممارسة لوني الخاص بك تبدو مثل هذا: قياس واحد: E (فتح)، F (الحنق 1)، F ( الحنق 2)، G (الحنق 3) قياس اثنين: F (الحنق 1)، F (الحنق 2)، G (الحنق 3)، G (الحنق 4). وهلم جرا حتى الحنق ال 12 (ثم إلى أسفل). تعلم مقياس الخماسي. يحتوي مقياس الخماسي فقط 5 ملاحظات وأنها جميعا سليمة جيدة عندما لعبت معا، لذلك يتم استخدام هذا المقياس في كثير من الأحيان ل سولوينغ. على وجه التحديد، الخماسي طفيفة شعبية خاصة في موسيقى الروك، موسيقى الجاز، والبلوز. تستخدم في كثير من الأحيان أن في بعض الأحيان يسمى فقط الخماسي قصيرة. هذا هو مقياس جيدا تعلم أدناه. يحتوي الخماسي الطفيفة على هذه الدرجات: الجذر والثالث والرابع والخامس والسادس والسابع (بالإضافة إلى الأوكتاف). في الأساس على نطاق صغير دون الثانية أو السادسة. على سبيل المثال، إذا بدأنا على سلسلة E المنخفضة، فإن مقياس خماسي القاصر سيكون: انخفاض E السلسلة: A (الحنق 5)، C (الحنق 8) سلسلة: D (الحنق 5)، E (الحنق 7) D (الحنق 5)، و (الحنق 7) من هنا، إذا كنا نريد، يمكننا الاستمرار، لعب نفس الملاحظات على سلاسل أعلى: g سلسلة: c (الحنق 5)، d (الحنق 7) b سلسلة: e (الحنق 5)، g (الحنق 8) e سلسلة: a (الحنق 5)، c (الحنق 8) تعلم البلوز الحجم. بمجرد أن تعرف مقياس الخماسي طفيفة، من السهل جدا للعب على نطاق ذات الصلة يسمى مقياس البلوز. كل ما عليك القيام به هو إضافة شقة درجة الخامسة درجة إلى الخماسي طفيفة. هذا سوف تعطيك مقياس مع ستة ملاحظات كل شيء آخر هو نفسه. على سبيل المثال، إذا أردنا تحويل المقياس الخماسي الطفيفة إلى مقياس البلوزات A، فإننا نلعب: سلسلة E منخفضة: A (حنق 5)، C (حنق 8) سلسلة: D (حنق 5)، إب 6). E (الحنق 7) D سلسلة: G (الحنق 5)، A (الحنق 7) G سلسلة: C (الحنق 5)، D (الحنق 7)، إب (الحنق 8) B سلسلة: E (الحنق 5) الحنق 8) سلسلة E: A (الحنق 5)، C (الحنق 8) ومن المعروف الخامس شقة باسم مذكرة الزرقاء. على الرغم من أنها في الحجم، يبدو قليلا غريبة ومتناقضة في حد ذاته، لذلك إذا كنت سولوينغ، في محاولة لاستخدامها باعتبارها لهجة الرائدة التي هي، وأنها تلعب على الطريق إلى ملاحظة أخرى. لا تعلق على المذكرة الزرقاء لفترة طويلة جدا تعلم إصدارات اثنين اوكتاف من جميع المقاييس. بمجرد الوصول إلى المقاييس اوكتاف، كنت لا دوما أن أعود إلى أسفل. مجرد علاج اوكتاف كالجذر الجديد واستخدام نفس نمط الخطوة للعب اوكتاف الثاني. لقد تطرقنا إلى هذا باختصار مع مقياس الخماسي الطفيفة أعلاه، ولكن هذا شيء يمكنك أن تتعلم لكافة المقاييس تقريبا. بدءا من واحدة من أسفل اثنين من السلاسل عموما يجعل من السهل لتناسب اثنين أوكتافات كاملة في نفس المنطقة من الرقبة. لاحظ أن الأوكتاف الثاني عادة ما يكون نمط الإصبع مختلفة على الرغم من أن الخطوات هي نفسها. دعونا نتعلم نطاق كبير اثنين اوكتاف بمجرد أن تعرف هذا، من الأسهل لمعرفة الإصدارات اثنين اوكتاف من المقاييس طفيفة. حسنا حاول G الكبرى (مقياس أول جدا تعلمناه في الجزء العلوي من هذه المادة). الآن، نحن نعرف هذا: انخفاض e سلسلة: g (الحنق 3)، a (الحنق 5)، b (الحنق 7) a سلسلة: c (الحنق 3)، d (الحنق 5)، e (الحنق 7) d سلسلة : F (الحنق 4)، G (الحنق 5) الاستمرار، وذلك باستخدام نفس نمط الخطوة: خطوة كاملة، خطوة كاملة، خطوة نصف، وهلم جرا. D سلسلة: G (الحنق 5)، A (الحنق 7) G سلسلة: B (الحنق 4)، C (الحنق 5)، D (الحنق 7) B سلسلة: E (الحنق 5)، F (الحنق 7)، G (الحنق 8). ثم الرجوع إلى أسفل قصص نجاح القارئ شرح فترات، حيث الملاحظات على الحنق، وكيف يصبح كبير طفيفة، وما هي في كثير من الأحيان في دروس منفصلة. هنا يتم تفسير العلاقة بين كل هذه الأمور معا، مما يجعل من الاسهل لفهم كل جزء .. المزيد - جون سميث أوضح حقا جداول الغيتار والفرق من الصخور والأزرق المقاييس في مثل هذه الطريقة التي ببساطة كنت قد أعطيت العنب الحلو إلى تأكل. أنا أقول هذا بعد 2 سنوات خبرة مع بلدي الغيتار المعلم و الدروس على الانترنت. شكر. المزيد - رافيفارما غاديراجو إيف كان يلعب الغيتار لمدة 60 سنة تقريبا ولم يكن لديه درس. ساعدت هذه المقالات لي فهم ما إم قادرة على اللعب. بسيطة جدا والأساسية. شكرا للمساعدة ... المزيد - جيمس كيلغور ساعدت هذه المقالة لي الكثير لأن كل شيء هو ذكر هنا خطوة بخطوة ومع الأرقام، مما يجعلها مفهومة جدا. الآن أستطيع أن ألعب جداول الغيتار .. المزيد - أنجالي باتل أنه مسح جميع أسئلتي المتعلقة تشكيل الحجم والرصاص كذلك. شكرا جزيلا للموضوع جميل .. أكثر - عكاش وادالكار كان هذا مفيدا جدا لزيادة ما هو في بلدي الكتب الغيتار الأساسية. عملت الرسوم التوضيحية بشكل جيد للغاية مع النص .. المزيد - تايرون بيرسون الصور على الصفحة مفيدة جدا. هذه المادة بسيطة وسهلة حتى رجل عادي لفهم. أكثر - راجشيكار سامباثكومار واضحة وشاملة، حتى أتمكن من بناء الدروس الخاصة بي على نحو فعال. - L. N. أفضل درس كان لي من أي وقت مضى. الآن أنا أفهم الملاحظات والمقاييس. شكرا لك - كلوز نادال أنا أحب ذلك. واضحة جدا وسهلة. أنا سعيد وجدت هذه المادة. - رفيق أيلان رائع، المعلومات الخاصة بك هو مفيد جدا وكاملة. - فيكاس شارما فمن السهل أن تتعلم لتحريك وتر الاصبع لالوتر. - ليونيل دسيلفا صور مبسطة جدا وكبيرة، وشكرا لكم - ريان جيل ممتاز، مفصلة جدا ومفيدة - بن كارنيجوهان سيباستيان باخس ضبط مرحبا J S باكس المتوسطة من الخبرة كان له التحكم الدقيق للصوت. باخ مؤلف كتاب الموسيقى التي تقول مباشرة هو عن وسيلة سليمة لضبط أجهزة لوحة المفاتيح. الموسيقى في الكتاب يعرض المشكلة الموسيقية العملية: للعب في جميع المقاييس الممكنة، في أعقاب الأمثلة من هذه الموسيقى، ونحن بحاجة إلى 25 ملاحظات مختلفة. (7 ملاحظات طبيعية، 7 ملاحظات مع الأدوات الحادة، 7 ملاحظات مع الشقق، 3 ملاحظات أخرى مع الحادة المزدوجة، بالإضافة إلى B شقة مزدوجة). ولكن، يجب التعامل مع هذا الشرط الثابت بطريقة أو بأخرى على لوحة المفاتيح التي لديها 12 رافعة فقط في اوكتاف، وليس 25، من خلال نوع من الحل التوفيقي العملي. فمن الضروري لتهدئة 12 الملاعب بعناية، لجعلها سليمة ارضاء موسيقيا في جميع هذه المقاييس. في الجزء العلوي من تلك الصفحة عنوان الكتب هو الرقم المتصاعد الذي عدم التماثل توجه الانتباه إلى نفسها. لسهولة رسمه بدقة، يبدو أنه قد تم استخلاصه مع كتاب استدارة (أي العمل على طول الحافة السفلية)، تركيبه بين الكلمات وحافة الصفحة. تستكشف الأوراق والمظاهرات هنا الفرضية التالية. لتلائم الأدلة من كل هذه المطلوبة 25 الملاحظات والمقاييس، باكس تصاعد خط الرسم في سياقها هو أن تؤخذ كدليل إضافي: أنه يوفر الرسم البياني العملي المباشر لضبط لوحات المفاتيح عن طريق الأذن، حل المشكلة. هو غير منتظم عن قصد، لا عشوائية أو خيالية. فإنه يدل على طريقة سريعة وفعالة التدريب العملي على ضبط أداة للعب هذا الكتاب، وإعطاء التوازن غير متكافئ بذوق، تثبيت مع أي حسابات. فإنه يدل على كيفية التحكم في الصوت. يبدو أن يوهان سيباستيان باخ أورد طريقة محددة وغير متكافئة لضبط لوحة المفاتيح. لم يعبر عنه في صيغنا المعتادة عادة من النظرية، أو الأرقام. بدلا من ذلك، رسم رسم تخطيطي يشبه تسلسل عملي عملي لضبط دبابيس الضبط، ويعمل تماما بالأذن. تقيد الموسيقى أي حل ليكون مزاجه متساوي تقريبا، وبعد ذلك، يظهر عدم انتظام المخططات كيفية تشكيل التفاوت الدقيق المطلوب. في تفسير بسيط، فإنه يحتفظ الملاحظات الرئيسية الست من C على نطاق واسع (C، D، E، F، G، A) في المواقف متباعدة بالتساوي، في بقعها العادية في سياق الممارسة في أواخر القرن 17th. ثم يتم ضبط املوالف الست امللفات املتبقية الست) لوحة المفاتيح والحامالت F و C و G و D و A (يف املواقف املرتفعة بذوق مع التعديالت عىل النحو املشار إليه يف الرسم التخطيطي، بحيث ميكنها أيضا أن تخدم الشقق أيضا. هذه العملية من التنازلات الدنيا ولكن الضرورية يجعل لوحة المفاتيح على استعداد لتشغيل الموسيقى في جميع الجداول الرئيسية والثانوية 24. كل مقياس له طابع تعبير مختلف بمهارة، والخطوات ليست كلها بالضبط نفس الحجم. التوافقات لديها التوترات المختلفة والتوابل، عندما يتم بناء الملاحظات من جداول معا في الحبال. طالب باخ وعرض نظام هذه المرونة الأساسية ليس فقط في الرسم البياني، ولكن أيضا من خلال الموسيقى في داس وهلتمبيرت كلافييه. ويعرض تحدي له ضبط (ويعطي الحل)، حيث معظم من اللافتات و فوجز كل تتطلب التعامل السلس لأكثر من 12 الملاحظات. على سبيل المثال، له مقدمة رئيسية و فوج استخدام كل من بب، F، C، G، D، A، E، B، F، C، G، D، A، E في نفس القطعة: 14 الملاحظات. بعض القطع الأخرى تتطلب 13، 15، ما يصل إلى 25 آخر قطعة في الكتاب، القاصر البوغ الضباب، يتطلب 17 (إب حتى فكس)، ويعرض 13 منهم في وقت مبكر من هذا الموضوع: ستة المواد الطبيعية C، G ، D، A، E، B، وسبعة الأدوات الحادة F و C و G و D و A و E و B. باخ يعرف بوضوح كيفية إعداد لوحات المفاتيح بشكل مناسب قبل كتابة موسيقاه لهم. والهدف من ذلك هو استعادة مخطط التجويد محددة من ضبط لوحة المفاتيح اليومية، والعلاقات السليمة التي كان يتوقع أن يسمع في الألحان والتناغمات، لأنها قد أثرت على خياله الخلاق. من خلال سماع كيف تعمل هذه العناصر الموسيقية من خلال التكوين والارتجال، ونحن كسب أدلة جديدة في تفسير الموسيقى باكس: تؤثر على الأقل مجالات التعبير، صياغة، ديناميات، والتوقيت، وكثافة، والدراما. توحي التوترات والقرارات داخل الموسيقى أفكار جديدة في الأداء، سواء من خلال ردود الفعل بديهية ومن خلال التحليل الدقيق. كان مزاجه الناتجة غائبة من كتب التاريخ لدينا. فقدت تحت طبقات من الافتراضات والعادات التي أدت بعيدا عن ذلك. وأعتقد أن الصوت الخاص لهذا المزاج، كجزء متكامل من الممارسة الموسيقية، له آثار عميقة على جميع باخس الموسيقية والموسيقى الصوتية التي تستخدم لوحات المفاتيح: إما مع أجزاء مكتوبة أو في باسو كونتينيو. منذ كل مقياس لديه أفكت مختلفة أو المزاج، من التوتر الموسيقية المختلفة ضمن فترات، والموسيقى يبدو الملونة وعلى قيد الحياة كما يتحرك. الموسيقى باخس نفسها هي مجموعة كبيرة من الأدلة الأولية لمزاجه: السبر الرائعة مقنعة ومعبرة عندما التجويد هو الحق، أو خشنة وقبيحة في المزاج الذي لا يحل بشكل صحيح المشاكل الأساسية. ويوضح هذا الموقع الإلكتروني لاريبس ويشرح الأوراق المنشورة، سواء من خلال النظرية والممارسة. فإنه يوفر مختلف مقدمات لهذا العمل، لمستويات مختلفة من اهتمام القراء. وهو بمثابة أرشيف للأفكار كما يتم استخدام هذا المزاج ومناقشتها بين الموسيقيين والباحثين، والمتحمسين. الخلفية الضرورية: فهم طرق التقسية العادية بنيت مزاج لوحة المفاتيح من مبدأ يطلق عليه أحيانا معنى: في أي حجم كان الحجم الثالث هو النغمة (الخطوة الكاملة) في متوسط ​​(متوسط) الموضع. على سبيل المثال، ضمن الفاصل الزمني الثالث الرئيسي من C-E، يتم وضع D عند النقطة المتوسطة حيث تكون الخطوات C-D و D-E هي نفس حجم بعضها البعض. في الممارسة العملية، عندما هدأ أداة لوحة المفاتيح عن طريق الأذن، ويتم ذلك عن طريق ضبط تسلسل من 5s، وتضييق كل 5 قليلا بنفس المقدار. (C-G-D-A-E-B-F-C-G شاربوارد، و C-F-بب-إب فلاتوارد). أو متساوية التباعد. اعتمادا على كمية من الضيق التي أعطيت لجميع 5s، هذه المعتادة العادية أو المعتادة لها خصائص موسيقية مختلفة. ومع ذلك، في هذه المزاج العادية، والأدوات الحادة والشقق ليست قابلة للتبديل. الملاحظات الوحيدة المتاحة هي إب-بب-F-C-G-D-A-E-B-F-C-G، أو استبدال أحيانا D ل إب. حيث تم ضبط لوحة المفاتيح مع بب العادية، أن الملعب سوف يبدو خطأ عندما لعبت في المقاييس، الألحان، أو التجانس كما لو كان A. يتم ضبطها بب عالية جدا أن تكون A. وبالمثل، F مرتفع جدا أن يكون لعبت كما E، B منخفضة جدا لتكون بمثابة سب، وتستمر هذه المشكلة في جميع هجاء التعزيزية الأخرى من الملاحظات. وعلاوة على ذلك، والأدوات الحادة والشقق لا تتصل مع بعضها البعض من قبل 5s. في مكان ما، عادة في G-إب أو في D-بب، هناك 6 تضاءل الذي هو أوسع بكثير من 5TH العادية. أي فترات لعبت عبر هذه الفجوة إنزارمونيك الصوت الخام وخارج لحن، على حد سواء بشكل متناسق ولحن، لأن بعض الملاحظات يتم سوء تفسيرها مع هجاء موسع خاطئ. وهذه الملاحظات مفقودة من المقاييس. لتكون قادرة على التعامل مع المتطلبات الأساسية للموسيقى، والهجاء الموسيقي من الملاحظات لموازينها وفواصل التوافقي، وهناك عدة طرق من خلال الحصول على هذه المشاكل مع مزاج العادية: توفير رافعات منفصلة على لوحة المفاتيح للأدوات الحادة والشقق (على الرغم من وهذا لا يزال لا يعالج مشاكل الملاحظات مثل E و سب، التي تخدم أيضا F الطبيعية و B الطبيعية). دع الصوت يكون خاطئا لملاحظات الأخطاء الإملائية، ونأمل أن لا يزعج المستمعين أو الموسيقيين المشاركين الآخرين كثيرا. ريتيون بعض الملاحظات لتكون قادرة على لعب التراكيب المختلفة، على افتراض أننا لسنا في حاجة الى اسمين لنفس ذراع داخل تكوين واحد. (على سبيل المثال: إذا كنت لا تحتاج إب أو بب، ريتون لهم أقل في الملعب يكون D و A.) تخطيط يمكن أن تبقى منتظمة، وتحريك الفجوة إلى مكان مختلف. تقليل كمية العادية من هدأ في 5s من قبل الكثير من أن تخطيط يتطور إلى 12 مذكرة مزاجه على قدم المساواة، والتخلص من جميع الفروق الأساسية وتصبح أتونال. للأسف، هذه الطريقة يزيل أي مزايا الصوتية التي جاءت من وجود الأكثر استخداما جداول و تنسجم أفضل في لحن. تغيير تخطيط العادية لتكون غير منتظمة الذوق. تتحرك بعض من الملعب صعودا أو هبوطا قليلا حتى أنها يمكن أن تخدم أكثر سلاسة مع اثنين من أسماء مختلفة. هذا هو ممارسة عادية أو مزاجه أوردينير، ووضع التنازلات حتى لوحة المفاتيح يمكن أن تقوم في مجموعة واسعة من الموسيقى. بالفعل من قبل القرن ال 17، والكثير من الموسيقى الحالية تدعو إلى الملاحظات الغريبة مثل D، A، E، B، أب، ديسيبل، غب، سب، أندور فب. ومن الشائع أيضا العثور على أزواج قوية (مثل A و بب) على حد سواء اللازمة في نفس التكوين. المشكلة تزداد تطرفا مع الموسيقى باخش، حتى أقرب له، و من الموسيقيين من حوله: في كثير من الأحيان تحتاج إلى أكثر من 12 مذكرات اسمه في تكوين واحد أن أي مزاجه العادية على غرار القديم لم يكن ممكنا. الموسيقى نفسها يخبرنا الذي تلاحظ أنه يحتاج، في إيجاد نظام هدأ مرضية لتشغيله. عندما يكون الخيار هو استخلاص تخطيط عادي أو غير منتظم، يمكن تلخيص الاستماع الدقيق وضبط في لوحة المفاتيح في المخططات الانسيابية العملية. لمزيد من المعلومات حول هذا، راجع مخططاتي التمهيدية والمفصلة. ومن الأفضل دراسة هذين المخططين من ثلاث صفحات من خلال العمل من خلالهم خطوة بخطوة في هاربسيكورد، كما فعلت في 30 عاما من ضبط الأذن. أنها تذهب من خلال أسئلة عملية حول الوضع الأداء والعشرات الموسيقية، ومن ثم من خلال عملية الاستماع والاختبار لكل مذكرة. هذه الخلفية العملية في هدأ العادية أمر ضروري، والعمل مباشرة في الصك، إذا كان واحد هو أن نفهم تماما المواد المقدمة في هذه المواد والموارد على شبكة الإنترنت. أطروحتي عن طريقة ضبط باخس تأتي من ممارسة موسيقية كأداء هاربسيكورديست وموالف أنها ليست الرسوم البيانية، كما افتراض بعض النقاد عن طريق الخطأ من قراءة رقيقة جدا من أجزاء من المقالات، أو من الاستماع إلى الحجج الدائرية من أحد الإخوة الآخرين. وتحدد الموسيقى داخل حدود ضيقة ما يجب أن يكون الحل ضبط، حتى قبل أي حجج حول باخس الرسم كدليل آخر على ممارسته ضبط. لوضع الملاحظات في نقاط حيث أنها يمكن أن تخدم واجب مزدوج في العلاقات على نطاق مع جميع الملاحظات الأخرى من حولهم، ورفع الحادة من مواقفهم الافتراضية في مزاجه العادية، ويتم تخفيض الشقق بالمثل. ونحن نعمل بدورها مع G، إب، C، بب، F، F، و B، والإجهاد بهم أقوى، واختبار كل شيء بعناية مع جميع المقاييس المتنافسة والتجانس التي تحتوي عليها. العملية تتطلب الذوق والخبرة الموسيقية، ونقل الملاحظات بشكل فردي حتى كل شيء يوازن بشكل صحيح، كما هو مطلوب من قبل الموسيقى. الملاحظات المستخدمة في التراكيب هي حقائق صعبة. يمكن التحقق منها من قبل أي شخص. كمصدر أساسي، النتيجة الموسيقية يخبرنا التعديلات التي هي ضرورية كما التنازلات، لإعداد جميع الملاحظات لجميع السياقات لحني والتوافقي. بعد إجراء التدريب العملي على تعديلات الملعب، واختبارها بدقة في الموسيقى أن يكون لعبت ، والمزاج غير النظامية الناتجة يمكن كتابة أسفل. وهذا يجعل من الأسهل على إنتاج بدقة في مناسبات أخرى، لذلك لم يكن لديك واحد لحل نفس المشكلة من تعديلات لذيذ مرة أخرى في كل مرة. أعتقد أن هذا ما فعله باخ هنا: من خلال التدريب العملي على عملية الاستماع العادية وتعديل المقاييس، وجد (أو أي شخص من حوله) تخطيطا غير نظامي جيد جدا يحل جميع المشاكل الموسيقية. انها تسمح واحدة للعب بشكل جميل في جميع جداول 24 الرئيسية والثانوية، في حين أنه يحافظ أيضا الأصوات الأكثر ملاءمة سمعيا في جداول الأكثر شيوعا المطلوبة. فإنه يوفر ما يكفي من التباين أن كل مقياس يبدو مختلفا بمهارة، والتي يمكن أن تجعل الموسيقى أكثر إثارة ومثيرة للاهتمام كما أنه ينظم. ثم كتب ما يكفي من التفاصيل، صورة نتيجة هدأ، لإظهار كيفية القيام بذلك مرة أخرى. وصفة الطريقة التي أعتقد باخ نفسه أوضح ذلك لموهبين هاربسيكورد ذوي الخبرة من قبل الأذن، خطوة خطوة، مع (أو بدون) رسمه: وضعنا الملاحظات من نطاق C الرئيسي أولا، ومن ثم نحن تناسب الملاحظات المتبقية في بعناية البقع للخطر: ليس مثل النمط القديم، حيث كنت اضطر إلى اختيار إما حاد أو شقة، ويكون ذلك يبدو سيئا كما الآخر. لحن الخاص بك الطبيعية 5TH فغداي مع العملية اليومية الخاصة بك لجعل كل 5s (أو 4s) يفرز مع نوعية متساوية لطيف، والتحقق من أن فا و سي كل نهاية المطاف حادة قليلا حاجز الخاص بك هنا هو أن فا واسعة في حوالي 3 في الثانية في تينور. هيريس جوت قليلا على جانب واحد، والتي تبين 3 يدق. كنت عادة قد انتهى كل شيء آخر مع نفس النوع من 5s: E-B-F-C-G، و F-بب-إب، وترك فجوة هناك بين إب و G حيث لا اتصال. بدلا من ذلك، سنقوم بوضع كل تلك الملاحظات المتبقية في مواقف مذعورة الذوق حتى نتمكن من تشغيل الموسيقى التي لديها الحادة أو الشقق، على طول الطريق. من E، ووضع الملاحظات الثلاث المقبلة أعلى من المعتاد، والقيام ببساطة 5S نقية E-B-F-C. يول لاحظ أن C يحصل على ما يصل إلى حد ما عالية ومشرقة ضد A، ولكن عند التحقق من ذلك كما دب-F، و A-C و دب-F لها نفس نوعية بعضها البعض. هذا كيف يعمل بشكل جيد يلعب كل الموسيقى. استمرار على من C، تناسب الملاحظات الثلاث الماضية G-D-A في مكان مع نصف قدر من هدأ فقط كما كنت تستخدم على 5ths الطبيعية: سوى وافر طفيف جدا، كل منهما. وهذا هو، عندما كنت تفعل كل واحد، ووضع كل واحد في بقعة نقية الخامس ولكن بعد ذلك أعتبر شقة أصغر قليلا. تأكد من أنك تجعل أب-C أفضل قليلا من E-G، و إب-G أفضل من B-D، و بب-D أفضل من F-A. كنقطة التفتيش النهائية الخاصة بك من A إلى F، أن البقعة المتبقية هي واسعة قليلا 5، ولكن ليس مزعجا (لا أحد سوف يسمع ذلك، بضع خطوات بعيدا عن الصك): فإنه يفرز نفس المبلغ كما كغدا الانتهاء للتو، ولكن في الاتجاه المعاكس. هيريس جوت على الجانب الآخر، والتي تبين نوعية A - F بقايا، وتضاءل 6th. الانتهاء من الصك من قبل أوكتافات في كلا الاتجاهين. هذا الرسم البياني يظهر لك نوعية كل 5S، إذا كنت ترغب في التحقق من أوكتافات معهم كما تذهب. الآن، اللعب والارتجال الموسيقى في جميع المقاييس الممكنة كل شيء يول لاحظ أنه يطابق التخطيط المادي للوحة المفاتيح: كلما كان لديك لتمتد إصبع للعب حاد أو شقة، والموسيقى يبدو أكثر حار قليلا من عندما كنت تلعب على الملاحظات الطبيعية فقط. مقالتي العلمية الرئيسية التي تقترح هذه القراءة من الأدلة تنشرها أقسام في شباط / فبراير وأيار / مايو 2005 قضايا الموسيقى في وقت مبكر. تلك المادة، باخس مزاجه غير عادي: حجر رشيد لدينا. يصف السياق التاريخي ويوفر التحليل الموسيقي والرياضي. الخطوط العريضة، وتحميل مجانا من ملفات بدف سبعة من مطبعة جامعة أكسفورد مقال تكميلي ومزاجه باخ و كلافيتشورد متاح في عدد نوفمبر 2005 من كلافيتشورد الدولية. أنه يحتوي على مزيد من المناقشة للقضايا العملية: بعض على وجه التحديد ل كلافيتشورد، وبعضها أكثر عموما في تحليل الموسيقى لوحة المفاتيح باخس، هيكل على نطاق والاعتبارات الأساسية، وتعليمات ضبط الأذن. وتشمل التراكيب المقدمة بوف 772-801 و 802 و 808 و 849 و 887 و 988 و 1079 و 1080. أوتلين النص الكامل A نوفمبر 2005 مقال يقدم تونينغ ملخصا من صفحتين للمزاجه وطابعه الموسيقي. النص الكامل طبعت في كتيبات بيتر واتشورنز الأقراص المدمجة. ويشرح المقال باخس آرت أوف مزاجه لمجلة بي بي سي ميوزك عام 2006 هذا المزاج من عدة زوايا عملية إضافية، مع التركيز بشكل خاص على مزيج من C الرئيسية و B المقاييس الرئيسية. (C، D، E، F، G، A، B B، C، D، E، F، G، A) النص الكامل تم اختصار نسخة بكس وأعطيت العنوان إن غود تيمبر. يتم سرد مقالات أخرى حول هذا مزاجه هنا. وهناك أيضا صفحة من استجاباتي لمقالات الشعوب الأخرى والكتب حيث يقدمون اتفاقاتهم أو خلافاتهم مع هذا المزاج. وتظهر محاضراتي في أكتوبر / تشرين الأول 2008 لجامعة جيمس ماديسون بأنها مقالة كاملة في حد ذاتها. في إيرلي ميوزك نوفمبر 2009 لدي رسالة إلى المحرر. داعيا إلى تقديم حجج عادلة بشأن هذا الموضوع. وخاصة من مارك ليندلي. الذي أسيء تمثيله واستهكي بعملي ثلاث مرات في تلك المجلة. في تمبيرامينتس غير متكافئة. فيولا دا غامبا سوسيتي جورنال فول 3 بارت 2 (2009)، 137-163، I ريفيو a 2009 بوك بي كلاوديو دي فيرولي. كما أتناول بعض الحجج الأخيرة حول مزاجه لوحة المفاتيح باخ، و ديونك المنهجية التحليلية عام 1979 من جون بارنز. بدف انظر أيضا محاضرات من أكتوبر 2010، عرضا في جامعة كولورادو: استعادة باخس ضبط من كلافير خفف جيدا. هذه تعطي وجهة نظر أعمق على تقنية فحص الملاحظات التي تستخدم في تركيبات مختلفة، والطريقة التي هذه العملية بإعلام الاستدلالات حول مزاجه. بداية سريعة ما قد مبتدئا لهذه المادة قراءة أولا، أكثر إنتاجية فتح صفحة الصوت المتدفقة وبدء بعض الموسيقى في الخلفية. ثم، بدء القراءة إما الفن باكس مزاجه المادة أو محاضرة غير رسمية. لقد أعدت مجموعة أكثر رسمية من الملاحظات (الشرائح في عرض تقديمي ل بويربوانت) لمحاضرة عامة في جامعة جيمس ماديسون، 22 أكتوبر 2008. أيضا، نلقي نظرة على أشرطة الفيديو تظهر هاربسيكورد يجري ضبطها ولعب. استمتع طريقة سهلة لضبط ذلك بدقة ومعظمها إلكترونيا إذا كنت تفضل عدم ضبط الأذن، وليس لديك لحساب أي يدق في أي مكان، القيام بذلك: على الجهاز الإلكتروني الخاص بك، حدد فالوتي. يجب أن يكون فالوتي دقيقة، وليس هجين غريب من فالوتيونغ. تعيين كافة الملاحظات التالية بالضبط أين هم في فالوتي: C، D، إب، E، F، G، و A. إيقاف تشغيله. تحقق من دقة المواد الطبيعية، عن طريق الأذن: F-C، C-G، G-D، D-A، A-E. هذه يجب أن يكون كل نوعية متطابقة (5S ضيق قليلا أو 4S واسعة)، كل يرتعش بلطف، مما يجعل دورة سلسة من 5s4ths. الاستماع للجودة. وليس لحساب أي معدلات فوز. من E، لحن B كما 5th النقي أو 4th. من B، لحن F كما 5th النقي أو 4th. من F، لحن C كما نقية 5th أو 4th. من C، لحن G كما 5th نقية، ولكن بعد ذلك مقارنة مع D. لور G قليلا، واختبار كل من هذه الفواصل (سغ، و غ)، حتى تجد متوسط ​​البقعة حيث هو على حد سواء خفف من كل من: الشوائب لطيف جدا . وأخيرا، لحن بب النقي من كل من إب و F. من هناك، وانخفاض بب قليلا، وهو نفس المبلغ الذي خفضت G، حتى كل من إب-بب و بب-F تظهر نفس النجاسة التي أعطيت ل C-G. هذا كل الانتهاء من الصك مع أوكتافات نقية ونيسونس نقية في كل مكان. عند وضع أوكتافات، تحقق من جميع 5s و 4s عن طريق الأذن للحصول على الجودة المناسبة. هذه العادة مفيدة بشكل خاص عند العمل على ثلاثة أضعاف. في نهاية المطاف مع F-C-G-D-A-E كما هي في فالوتي (16 فاصلة كل) E-B-F-C نقية C-G-D-A بلطف جدا خفف (112 فاصلة كل) A - F بقايا أيضا خفف بلطف، ولكن يحدث أن تكون واسعة. إزاحة ل كليرتيون، بيتشلاب، وغيرها من المستقبلات الإلكترونية إذا كنت تستخدم التطبيق أو الجهاز الذي يسمح تعريفات المزاج مخصصة، مثل كليارتيون. إعداده مع إزاحة المائة التالية من مزاجه على قدم المساواة: التحقق من كل شيء عن طريق الأذن، كما هو موضح في القسم أعلاه. يجب أن يكون لديك على نحو سلس وسلس F-C-G-D-A-E (مع نفس نوعية واحدة أخرى، 16 فاصلة ضيقة)، نقية E-B-F-C، والارتداد بلطف جدا C-G-D-A. يجب أن توضع بب في مكان أقل قليلا جدا من بقعة حيث كان من شأنه أن يكون نقيا من كل من D و F. عند إعداد أوكتافات، تحقق من كل 5s و 4s عن طريق الأذن لنوعية مناسبة. هذه العادة مفيدة بشكل خاص عند العمل على ثلاثة أضعاف. ل موالف بيتشلاب، وهو أحدث (2014) وأفضل من كليرتيون، القيام بما يلي: الحصول على فتح كل شيء دفع نسخة من التطبيق، للحصول على السيطرة الكاملة على ما تقومون به. إنشاء باكلهمان 1722 كمزاجه مخصص. أدخل الإزاحة من C، وليس A. الأرقام المستخدمة هي: C (0.0) و C (-2.0) و D (-3.9) و إب (-2.0) و E (-7.8) و F (2.0) و F (-3.9)، G (-2.0)، G (-2.0)، A (-5.9)، بب (-2.0)، B (-5.9). عند الضبط معه، تأكد من تعيين المذكرة الجذر إلى C، وليس A. تحقق من كل عملك عن طريق الأذن، عند الانتهاء، للتأكد من عدم حدوث أخطاء أو نقل. يجب أن يكون لديك على نحو سلس وسلس F-C-G-D-A-E (مع نفس نوعية واحدة أخرى، 16 فاصلة ضيقة)، نقية E-B-F-C، والارتداد بلطف جدا C-G-D-A. يجب أن توضع بب في مكان أقل قليلا جدا من بقعة حيث كان من شأنه أن يكون نقيا من كل من D و F. انظر أيضا هذا الاستعراض من بيتشلاب بول بوليتي. Audio samples and video demonstrations There are pages of recorded musical examples and 20-minute playlists of streaming audio. with performances by Bradley Lehman on harpsichords and pipe organs. New Additional sample recordings are available variously on Last. fm. on iLike. and Facebook as featured excerpts from LaripS 1002 (organ) and LaripS 1003 (harpsichord and organ). New More than a dozen recordings by other musicians using this BachLehman 1722 temperament: on harpsichords, fortepianos, pipe organs, digital organs, synthesizers, and more. There is a growing collection of video demonstrations. showing how to tune harpsichords by ear in this and several related temperaments. Other resources Introductory lecture at an informal level. (How to explain temperament, and why it matters, to teenagers) A temperament diagram with remarks about the scales and intervals. Several sets of instructions for tuning instruments by ear, or with electronic devices. Several additional temperaments to set by ear. see especially my ordinary temperament to play 17th century German music (Bonus 5 on that page). New in November 2008 Jean-Philippe Rameaus published preference in 1726 was apparently for a system with regular tempering in Bb-F-C-G-D-A-E-B, and the other four notes tastefully arranged to fill the gap. My presentation of this is in section 6 of the practical instructions page. A historical survey of other Bach temperaments as hypothetical reconstructions. This blog post says the opposite of its lazy and deliberately provocative title. I have become a huge fan of ReactiveUI. I just want to ramble about the path I took to get here. Listening to Paul Betts I first heard about ReactiveUI at a conference presentation by Paul Betts. I think it was at Xamarin Evolve. Mostly I remember feeling dumb. He said a lot of things that I didnt understand. I went to that session without much real experience in Model-View-ViewModel (MVVM) development. Conceptually, I understood the idea of a ViewModel. But Paul mostly talked about how ReactiveUI avoids certain problems. And since I had not experienced those problems, his words didnt sink in. Talking to teenagers about risk Each time one of my kids was approaching adolescence, I sat down and explained the risks associated with certain choices. Laws and moral judgements aside, the simple fact is that many choices involve risks, and I thought it would be helpful to pass along that bit of information. And in each case, my child said, Thanks Dad, and proceeded to always make wise and low-risk choices from that point on. Well, actually, no. Teenagers simply do not learn that way. They process risk very differently from people who are more mature. Tell a 16-year-old that if you drive too fast you might get a ticket. The adolescent will immediately begin driving too fast, and, in all likelihood, will not get ticket. This is how teenagers realize they are smarter than their parents. Tangent 1: It is almost certainly a good thing that young people are more brave. It would be Very Bad if everybody started out with the same level of risk aversion as the average 65-year-old. Go watch the Tapestry episode of Star Trek TNG. Tangent 2: I really should claim no expertise in parenting, but if somebody forced me to write a book on parenting a teenager, I would say this: Let your kid suffer from their own choices. That said, it is worth the effort to try and help them avoid the really bad mistakes, the ones with consequences that last for decades. But they do have to learn to make their own choices. Realize this as early as you can. The path to frustration starts with making everything all about you. How we learn new technologies My metaphor has many problems. For starters, Paul Betts is not my Dad. Also, the element of adolescent rebellion was not present. I didnt hear Pauls wisdom and run in the opposite direction because of my deep need to separate my identity from his. In fact, I started devouring everything I could find on MVVM and IObservable. I really wanted to understand what he was saying. But the metaphor works in one significant way: Like a teenager, I had to learn by doing. Nobodys words made much of a difference. None of that reading helped me become a a user of ReactiveUI. I went down another path. Actually, I went down several other paths. Maybe its just me I observe that most developers want content that explains how to get something done. If your objective is to do X, then do the following steps. The most popular books and articles tend to follow this pattern. Questions of this form are the ones that do well on StackOverflow. But this is almost never what I want. I much prefer content that explains how things work. Once I understand that, I can figure out the steps myself. When I am developing software, I always, ALWAYS do better when I understand what is going on under hood, when I can see through the leaky abstractions. And as I mentioned, I am apparently in the very small minority on this. If 90 of the world disagrees with me, does that put me in the top 10. Or does it mean my approach is somehow defective Modesty aside, my history contains enough successes to allow me some confidence in believing that my approach is better. I also observe that my approach is just a different spelling for the old adage, Give a man a fish and you feed him for a day. Teach a man to fish and he eats for a lifetime. If you tell a software developer what to type and where to click, you can help them complete todays task. But if you instead teach them how things work, they will be able to apply that understanding on other days too. هممم. Im talking myself into this. I dont know why most people prefer shallow recipes, but I really do think deep understanding is better. Still, I like to stay open-minded about things. Ive got a lot of failures too. The truth is that my approach has tradeoffs. The need to understand everything tends to slow me down during the early stages. I usually gain some of that back in the fourth quarter of the game, where deeper understanding is often helpful in diagnosing tricky problems. But again, in the decision making around software development, absolutes are rare. Ill admit that sometimes a simple set of steps without depth are exactly what is needed. Maybe the ReactiveUI docs are just bad I dont know. يمكن. Ive read the docs plenty. They dont seem bad to me. I also see nothing there that makes me want to defend them as the best docs ever. Suppose that I regret not choosing ReactiveUI sooner. Further suppose that I wanted to blame somebody else for my choices. I guess I could find something to complain about. But I also dont tend to find that criticizing somebody elses work is helpful. And remember, I started this journey sitting in front of an audience, listening to Paul Betts, and feeling dumb. To be clear, in that kind of context, I like feeling dumb. Its an opporunity to learn. So why did I not choose ReactiveUI sooner I guess I dont really know. But Im pretty sure that nothing has made me appreciate ReactiveUI more than the suffering that comes from not using it. And that remark isnt very helpful, is it Id like to try and do better. دعنا نرى. Son, its just basic statistics. If youre going to always drive 15 MPH over the speed limit, you will eventually get caught. Suppose you roll the dice 20 times in a row without getting a 12. You still might get a 12 on the next roll, right Oh, wait, wrong topic. دعني احاول مجددا. Why is ReactiveUI awesome In some software development situations, like mobile apps, if you take a step back and look at the forest instead of the trees, you will see that most of your code is reacting to something that changed. There are lots of tools you can use to approach this kind of app. You can use C events and callbacks and switch statements and delegates and lambdas and observables and notifications and bindings and more. For simple apps, none of these approaches are much better than any other. But as your app gets more complicated, some approaches cope more gracefully than others. Most cars drive pretty smooth at 30 MPH. But at 75 MPH, some vehicles are still giving a smooth ride, while others are shaking. Lets try a conceptual example or two. Suppose you have a button, and you want something to happen when the user presses that button. This is pretty simple. All reasonable solutions to this problem are about the same. On the other hand, lets say you have a list of items. The items in that list come from a SQL query. That query has 4 inputs, each of which comes from a UI control. Every time one of those controls changes its value, the query needs to be re-run and the list needs to be updated. A couple of those controls need to be disabled under certain circumstances. These UI elements have a complicated relationship. We still have plenty of choices in how to express that relationship in code, but this situation is complicated enough that we start to see differences between those approaches. Some of the ones that worked out really well in the simple case seem kinda tedious for this case. If my driveway has half an inch of snow, all methods of clearing it are about the same. But if my driveway has 15 inches of snow, a shovel is decidedly inferior to a tractor. Why do I like ReactiveUI Because I have found that it copes gracefully as the situation gets more complicated. Why is this Much of the credit goes to the reactive foundation on which ReactiveUI is built. Reactive Extensions. Rx. IObservable. These building blocks are particularly adept at expressing the relationship between a group of things that are changing. ReactiveUI adds another layer (or two) on top of these things to make that expressiveness more convenient when implementing user interfaces. To be honest, I fudged a little bit when I said that all solutions are roughly equivalent when the problem is simple. Thats not quite true. For simple situations, Id have to admit that ReactiveUI might be a little worse. There is a learning curve. If I am writing a grocery list, I could use a word processor, but a pencil and paper is actually simpler. But if I am writing a novel, the word processor is the clear winner. Im claiming that the effort to learn Rx and ReactiveUI is worth the trouble. My claim is based on this notion that ReactiveUI shines as complexity increases, but also on my belief that most people underestimate the complexity of their app. If you disagreed with me above when I said that most of your code is reacting to something that changed, you might be underestimating the complexity of your app. It is in fact very common to start implementing under the assumption that something will not change and then later realize that you need notifications or events. Or an observable. Would the paragraphs above have changed my course earlier I dont know. Probably not. I didnt start this believing that I could write the best ReactiveUI advocacy ever. Looking at it now, I cant believe I wrote it with no code in it. The canonical ReactiveUI evangelism pamphlet has gotta have WhenAnyValue() in it somewhere. I just think its interesting that despite my best efforts, I was unable to really understand the benefits of ReactiveUI until I tried using its alternatives. My current project is late. If I had chosen ReactiveUI earlier, maybe it would be, er, less late There are questions here worth asking. But am I 100 certain that it is always better to spare yourself the learning experience of using less effective approaches No. Can I credibly claim that everyone should choose ReactiveUI in every situation Certainly not. Maybe all I can say is that I am currently having a great experience with ReactiveUI. Maybe that means the rest of this blog post is useless. But you should have known that when you saw the cheesy title. Recently, Sven Slootweg (joepie91) published a blog entry entitled Why you should never, ever, ever use MongoDB. It starts out with the words MongoDB is evil and proceeds to give a list of negative statements about same. I am not here to respond to each of his statements. He labels them as facts, and some (or perhaps all) of them surely are. In fact, for now, lets assume that everything he wrote is correct. My point here is not to say that the author is wrong. Rather, my point here is that this kind of blog entry tells me very little about MongoDB while it tells me a great deal about the emotions of the person who wrote it. Like I said, it may be true that every WTF the author listed is correct. It is also true that some software has more WTFs than others. Im not a MongoDB expert, but Ive been digging into it quite a bit, and I could certainly make my own list of its WTFs. And I would also admit that my own exploration of Couchbase has yielded fewer of those moments. Therefore, every single person on the planet who chooses MongoDB instead of Couchbase is making a terrible mistake, right Let me briefly shift to a similar situation where I personally have a lot more knowledge: Microsoft SQL Server vs PostgreSQL. For me, it is hard to study SQL Server without several WTF moments. And while PostgreSQL is not perfect, I have found that a careful study there tends to produce more admiration than WTFs. So, after I discovered that (for example) SQL Server has no support for deferred foreign keys, why didnt I write a blog entry entitled Why you should never, ever, ever use SQL Server Because I calmed down and looked at the bigger picture. I think I could make an entirely correct list of negative things about SQL Server that is several pages long. And I suppose if I wanted to do that, and if I were really angry while I was writing it, I would include only the facts that support my feelings, omitting anything positive. For example, my rant blog entry would have no reason to acknowledge that SQL Server is the mostly widely used relational database server in the world. These kinds of facts merely distract people from my point. But what would happen if I stopped writing my rant and spent some time thinking about the fact I just omitted I just convinced myself that this piece of software is truly horrible, and yet, millions of people are using it every day. How do I explain this If I tried to make a complete list of theories that might fit the facts, todays blog entry would get too long. Suffice it to say this: Some of those theories might support an anti-Microsoft rant (for example, maybe Microsots field sales team is really good at swindling people), but Im NOT going to be able to prove that every single person who chose SQL Server has made a horrible mistake. There is no way I can credibly claim that PostgreSQL is the better choice for every single company simply because I admire it. Even though I think (for example) that SQL Server handles NULL and UNIQUE in a broken way, there is some very large group of people for whom SQL Server is a valid and smart choice. So why would I write a blog entry that essentially claims that all SQL Server users are stupid when that simply cannot be true I wouldnt. Unless I was really angry. MongoDB is undisputably the top NoSQL vendor. It is used by thousands of companies who serve millions of users every day. Like all young software serving a large user base, it has bugs and flaws, some of which are WTF-worthy. But it is steadily getting better. Any discussion of its technical deficiences which does not address these things is mostly just somebody venting emotion. Memory safety I have written a lot of C code over the years. More than once while in the middle of a project, I have stopped to explore ways of getting the compiler to catch my memory leaks. I tried the Clang static analyzer and Frama-C and Splint and others. It just seemed like there should be a way, even if I had to annotate function signatures with information about who owns a pointer. So perhaps you can imagine my joy when I first read about Rust. Even more cool, Rust has taken this set of ideas so much further than the simple feature I tried to envision. Rust doesnt just detect leaks, it also: frees everything for you, like a garbage collector, but its not. prevents access to something that has been freed. prevents modifying an iterator while it is being used. prevents all memory corruption bugs. automatically disposes other kinds of resources, not just allocated memory. prevents two threads from having simultaneous access to something. That last bullet is worth repeating: With Rust, you never stare at your code trying to figure out if its thread safe or not. If it compiles, then its thread safe. Safety is Rusts killer feature, and it is very compelling. Mutability If you come to Rust hoping to find a great functional language, you will be disappointed. Rust does have a bunch of functional elements, but it is not really a functional language. Its not even a functional-first hybrid. Nonetheless, Rust has enough cool functional stuff available that it has been described as ML in C clothing. I did my Rust port of LSM as a line-by-line translation from the F version. This was not a particularly good approach. Functional programming is all about avoiding mutable things, typically by using recursion, monads, computation expressions, and immutable collections. In Rust, mutability should not be avoided, because its safe. If you are trying to use mutability in a way that would not be safe, your code will not compile. So if youre porting code from a more functional language, you can end up with code that isnt very Rusty. If you are a functional programming fan, you might be skeptical of Rust and its claims. Try to think of it like this: Rust agrees that mutability is a problem -- it is simply offering a different solution to that problem. Learning curve I dont know if Rust is the most difficult-to-learn programming language I have seen, but it is running in that race. Anybody remember back when Joel Spolsky used to talk about how difficult it is for some programmers to understand pointers. Rust is a whole new level above that. Compared to Rust, regular pointers are simplistic. With Rust, we dont just have pointers. We also have ownership, borrows, and lifetimes. As you learn Rust, you will reach a point where you think you are starting to understand things. And then you try to return a reference from a function, or store a reference in a struct. Suddenly you have lifetime ltagt annotations ltagt all ltagt over ltagt the ltagt place ltagt . And why did you put them there Because you understood something Heck no. You started sprinkling explicit lifetimes throughout your code because the compiler error messages told you to. Im not saying that Rust isnt worth the pain. I personally think Rust is rather brilliant. But a little expectation setting is appropriate here. Some programming languages are built for the purpose of making programming easier. (It is a valid goal to want to make software development accessible to a wider group of people.) Rust is not one of those languages. That said, the Rust team has invested significant effort in excellent documentation (see The Book ). And those compiler error messages really are good. Finally, let me observe that while some things are hard to learn because they are poorly designed, Rust is not one of those things. The deeper I get into this, the more impressed I am. And so far, every single time I thought the compiler was wrong, I was mistaken. I have found it helpful to try to make every battle with the borrow checker into a learning experience. I do not merely want to end up with the compiler accepting my code. I want to understand more than I did when I started. Error handling Rust does not have exceptions for error handling. Instead, error handling is done through the return values of functions. But Rust actually makes this far less tedious than it might sound. By convention (and throughout the Rust standard library), error handling is done by returning a generic enum type called ResultltT, Egt. This type can encapsulate either the successful result of the function or an error condition. On top of this, Rust has a clever macro called try. Because of this macro, if you read some Rust code, you might think it has exception handling. This function returns std::io::Resultltu64gt. When it calls the seek() method of the trait object it is given, it uses the try macro, which will cause an early return of the function if it fails. In practice, I like Rusts Result type very much. The From and Error traits make it easy to combine different kinds of ResultError values. The distinction between errors and panics seems very clean. I like having the compiler help me be certain that I am propagating errors everywhere I should be. (I dislike scanning library documentation to figure out if I called something that throws an exception I need to handle.) Nonetheless, when doing a line-by-line port of F to Rust, this was probably the most tedious issue. Lots of functions that returned () in F changed to return Result in Rust. Type inference Rust does type inference within functions, but it cannot or will not infer the types of function arguments or function return values. Very often I miss having the more complete form of type inference one gets in F. But I do remind myself of certain things: The Rust type system is far more complicated than that of F. Am I holding a Foo Or do I have a ampFoo (a reference to a Foo) Am I trying to transfer ownership of this value or not Being a bit more explicit can be helpful. F type inference has its weaknesses as well. Most notably, inference doesnt work at all with method calls. This gives the object-oriented features of F a very odd feel, as if they dont belong in the language, but it would be unthinkable for a CLR language not to have them. Rust has type inference for integer literals but F does not. The type inference capabilities of Rust may get smarter in the future. Rust iterators are basically like F seq (which is an alias for IEnumerable). They are really powerful and provide support for functional idioms like List. map. For example: This function takes a slice (a part of an array) of bytes (u8) and returns its representation as a hex string. Vec is a growable array iter() means something different than it does in F. Here, it is the function that returns an iterator for a slice map() is pretty similar to F. The argument above is Rusts syntax for a closure. collect() also means something different than it does in F. Here, it consumes the iterator and puts all the mapped results into the Vec we asked for. connect() is basically a join of all the resulting strings. However, there are a few caveats. In Rust, you have a lot more flexibility about whether you are dealing with a Foo or a reference to a Foo, and most of the time, its the latter. Overall, this is just more work than it is in F, and using iterators feels like it magnifies that effect. Performance I havent done the sort of careful benchmarking that is necessary to say a lot about performance, so I will say only a little. I typically use one specific test for measuring performance changes. It writes 10 LSM segments and then merges them all into one, resulting in a data file. On that test, the Rust version is VERY roughly 5 times faster than the F version. The Rust and F versions end up producing exactly the same output file. The test is not all that fair to F. Writing an LSM database in F was always kind of a square-peground-hole endeavor. With Rust, the difference in compiling with or without the optimizer can be huge. For example, that test runs 15 times faster with compiler optimizations than it does without. With Rust, the LLVM optimizer cant really do its job very well if it cant do function inlining. Which it cant do across crates unless you use explicit inline attributes or turn on LTO. In F, there often seems to be a negative correlation between idiomatic-ness and performance. In other words, the more functional and idiomatic your code, the slower it will run. F could get a lot faster if it could take better advantage of the ability of the CLR to do value types. For example, in F, option and tuple always cause heap allocations. Integer overflow Integer overflow checking is one of my favorite features of Rust. In languages or environments without overflow checking, unsigned types are very difficult to use safely, so people generally use signed integers everywhere, even in cases where a negative value makes no sense. Rust doesnt suffer from this silliness. For example, the following code will panic: That said, I havent quite figured out how to get overflow checking to happen on casts. I want the following code (or something very much like it) to panic: Note that, by default, Rust turns off integer overflow checking in release builds, for performance reasons. Miscellany F is still probably the most productive and pleasant language I have ever used. But Rust is far better than C in this regard. IMO, the Read, Write, and Seek traits are a much better design than s Stream, which tries to encapsulate all three concepts. cargo test is a nice, easy-to-use testing framework that is built into Cargo. احب ذلك. crates. io is like NuGet for Rust, and its integrated with Cargo. If cargo bench wants to always report timings in nanoseconds, I wish it would put in a separator every three digits. I actually like the fact that Rust is taking a stance on things like functionnamesinsnakecase and TypeNamesInCamelCase. even to the point of issuing compiler warnings for names that do not match the conventions. I dont agree 100 with their style choices, and thats my point. Being opinionated might help avoid a useless discussion about something that never really matters very much anyway. I miss printf-style format strings. Im not entirely sure I like the automatic dereferencing feature. I kinda wish the compiler wouldnt help me in this manner until I know what Im doing. Bottom line I am seriously impressed with Rust. Then again, I thought that Eric Banas Hulk movie was pretty good, so you might want to just ignore everything I say. In terms of maturity and ubiquity, C has no equal. Still, I believe Rust has the potential to become a compelling replacement for C in many situations. I look forward to using Rust more. Zumero for SQL Server (ZSS) is a solution for replication and sync between SQL Server and mobile devices. ZSS can be used to create offline-friendly mobile apps for iOS, Android, Windows Phone, PhoneGap, and Xamarin. Our 2.0 release is a major step forward in the maturity of the product. Compatibility with Azure SQL -- This release offers improved compatibility with Microsoft Azure SQL Database. Whether you prefer cloud or on-prem, ZSS 2.0 is a robust sync solution. Improved filtering -- In the 2.0 release, filters have become more powerful and easier to use. Arcane limitations of the 1.x filtering feature have been lifted. New capabilities include filtering by date, and filtering of incoming writes. Schema change detection -- The handling of schema changes is now friendlier to the use of other SQL tools. In 1.x, schema changes needed to be performed in the ZSS Manager application. In 2.0, we detect and handle most schema changes automatically, allowing you to integrate ZSS without changing the way you do things. Better UI for configuration -- The ZSS Manager application has been improved to include UI for configuration of multiple backend databases, as well as more fine-grained control of which columns in a table are published for sync. Increased Performance -- Perhaps most important of all, ZSS 2.0 is faster. In some situations, it is a LOT faster. Isnt New Microsoft awesome NET is going open source And cross-platform On Github. The news out of Redmond often seems like a mis-timed April fools joke. But its real. This is happening. Microsoft is apparently willing to do whatever it takes to get developers to love them again. How did this company change so much, so quickly A lot of folks are giving credit to CEO Satya Nadella. And there could be some truth to that. Maaaaaaybe. Another popular view: Two of the most visible people in this story are: Scott Hanselman (whose last name I cannot type without double-checking the spelling.) and Scott Gu (whose last name is Guenther. Or something like that. I can never remember anything after the first two letters.) I understand why people think maybe these two guys caused this revolution. They both seem to do a decent job I suppose. But the truth is that New Microsoft started when Microsoft hired Martin Woodward . ماذا. Who the heck is Martin Woodward Martins current position is Executive Director of the Foundation. Prior to that, he worked as a Program Manager on various developer tools. Nobody knows who Martin is. Either of the Scotts have 2 orders of magnitude more Twitter followers. But I think if you look closely at Martins five year career at Microsoft, you will see a pattern. Every time a piece of Old Microsoft got destroyed in favor of New Microsoft, Martin was nearby. Dont believe me Ask anybody in DevDiv how TFS ended up getting support for Git. Its all about Martin. So all the credit should go to Martin Woodward then You see, Martin joined Microsoft in late 2009 as part of their acquisition of Teamprise. And Teamprise was a division of SourceGear. I hired Martin Woodward (single-handedly, with no help or input from anybody else) in 2005. Four years later, when Microsoft acquired our Teamprise division (which I made happen, all by myself), Martin became a Microsoft employee. Bottom line: Are you excited about all of the fantastic news coming out of Build 2015 this week That stuff would never have happened if it were not for ME. Eric, how can we ever thank you So, now that you know that I am the one behind all the terrific things Microsoft is doing, Im sure you want to express your appreciation. But that wont be necessary. While I understand the sentiment, in lieu of expensive gifts and extravagant favors, I am asking my adoring fans to do two things: First, try not to forget all the little people at Microsoft who are directly involved in the implementation of change. People like Martin, or the Scotts, or Satya. Even though these folks are making a relatively minor contribution compared to my own, I would like them to be supported in their efforts. Be positive. Dont second-guess their motives. Lay aside any prejudices you might have from Old Microsoft. Believe. Second, get involved. Interact with New Microsoft as part of the community. Go to Github and grab the code. Report an issue. Send a pull request. Embellishments and revisionist history aside. Enjoy this Its a GREAT time to be a developer. A couple weeks ago I blogged about mobile sync for MongoDB. Updated Status of Elmo Embeddable Lite Mongo continues to move forward nicely: Progress on indexes: Compound and multikey indexes are supported. Sparse indexes are not done yet. Index key encoding is different from the KeyString stuff that Mongo itself does. For encoding numerics, I did an ugly-but-workable F port of the encoding used by SQLite4. Hint is supported, but is poorly tested so far. Explain is supported, partially, and only for version 3 of the wire protocol. More work to do there. The query planner (which has delusions of grandeur for even referring to itself by that term) isnt very smart. Indexes cannot yet be used for sorting. Indexes are currently never used to cover a query. When grabbing index bounds from the query, elemMatch is ignored. Because of this, and because of the way Mongo multikey indexes work, most index scans are bounded at only one end. The min and max query modifiers are supported. The query planner doesnt know how to deal with or at all. Progress on full-text search: This feature is working for some very basic cases. Phrase search is not implemented yet. Language is currently ignored. The matcher step for text is not implemented yet at all. Everything within the index bounds will get returned. The tokenizer is nothing more than string. split. No stemming. No stop words. Negations are not implemented yet. Weights are stored in the index entries, but textScore is not calculated yet. I also refactored to get better separation between the CRUD logic and the storage of bson blobs and indexes (making it easier to plug-in different storage layers). Questions about client-side APIs So, lets assume you are building a mobile app which communicates with your Mongo server in the cloud using a replicate and sync approach. In other words, your app is not doing its CRUD operations by making networkingREST calls back to the server. Instead, your app is working directly with a partial clone of the Mongo database that is right there on the mobile device. (And periodically, that partial clone is magically synchronized with the main database on the server.) What should the API for that embedded lite mongo look like Obviously, for each development environment, the form of the API should be designed to feel natural or native in that environment. This is the approach taken by Mongos own client drivers. In fact, as far as I can tell, these drivers dont even share much (or any) code. For example, the drivers for C and Java and Ruby are all different, and (unless Im mistaken) none of them are mere wrappers around something lower level like the C driver. Each one is built and maintained to provide the most pleasant experience to developers in a specific ecosystem. My knee-jerk reaction here is to say that mobile developers might want the exact same API as presented by their nearest driver. For example, if I am building a mobile app in C (using the Xamarin tools), there is a good chance my previous Mongo experience is also in C, so I am familiar with the C driver, so thats the API I want. Intuitive as this sounds, it may not be true. Continuing with the C example, that driver is quite large. Is its size appropriate for use on a mobile device Is it even compatible with iOS, which requires AOT compilation (FWIW, I tried compiling this driver as a PCL (Portable Class Library), and it didnt Just Work.) For Android, the same kinds of questions would need to be asked about the Mongo Java driver. And then there are Objective-C and Swift (the primary developer platform for iOS), for which there is no official Mongo driver. But there are a couple of them listed on the Community Supported Drivers page: docs. mongodb. orgecosystemdriverscommunity-supported-drivers . And we need to consider PhonegapCordova as well. Is the Node. js driver a starting point And in all of these cases, if we assume that the mobile API should be the same as the drivers API, how should that be achieved Fork the driver code and rip out all the networking and replace it with calls to the embedded library Or should each mobile platform get a newly-designed API which is specifically for mobile use cases Believe it or not, some days I wonder: Suppose I got Elmo running as a server on an Android device, listening on localhost port 27017. Could an Android app talk to it with the Mongo Java driver unchanged Even if this would work, it would be more like a proof-of-concept than a production solution. Still, when looking for solutions to a problem, the mind goes places. So anyway, Ive got more questions than answers here, and I would welcome thoughts or opinions. Or email me: ericzumero Or Tweet: ericsink Or find me at MongoDB World in NYC at the beginning of June. Talks over the network to the sync server Pushes and pulls incremental changes to keep the mobile database synchronized For this blog entry, I want to talk mostly about the mobile database. In our Zumero for SQL Server solution, this role is played by SQLite. There are certainly differences between SQL Server and SQLite, but on the whole, SQLite does a pretty good job pretending to be SQL Server. What embedded database could play this role for Mongo This question has no clear answer, so weve been building a a lightweight Mongo-compatible database. Right now its just a prototype, but its development serves the purpose of helping us explore mobile sync for Mongo. Embeddable Lite Mongo Or Elmo, for short. Elmo is a database that is designed to be as Mongo-compatible as it can be within the constraints of mobile devices. In terms of the status of our efforts, let me begin with stuff that does NOT work: Sharding is an example of a Mongo feature that Elmo does not support and probably never will. Elmo also has no plans to support any feature which requires embedding a JavaScript engine, since that would violate Apples rules for the App Store. We do hope to support full text search (text, meta, etc), but this is not yet implemented. Similarly, we have not yet implemented any of the geo features, but we consider them to be within the scope of the project. Elmo does not support capped collections, and we are not yet sure if it should. Broadly speaking, except for the above, everything works. Mostly: All documents are stored in BSON Except for JS code, all BSON types are supported Comparison and sorting of BSON values (including different types) works All basic CRUD operations are implemented The update command supports all the update operators except isolated The update command supports upsert as well The findAndModify command includes full support for its various options Basic queries are fully functional, including query operators, projection, and sorting The matcher supports Mongos notion of query predicates matching any element of an array CRUD operations support resolution of paths into array subobjects, like x. y to Regex works, with support for the i, s, and m options The positional operator works in update and projection Cursors and batchSize are supported The aggregation pipeline is supported, including all expression elements and all stages (except geo) Support for indexes is being implemented, but they dont actually speed anything up yet. The dbref format is tolerated, but is not yet resolved. The explain feature is not implemented yet. For the purpose of storing BSON blobs, Elmo is currently using SQLite. Changing this later will be straightforward, as were basically just using SQLite as a key-value store, so the API between all of Elmos CRUD logic and the storage layer is not very wide. Notes on testing: Although mobile-focused Elmo does not need an actual server, it has one, simply so that we can run the jstests suite against it. The only test suite sections we have worked on are jstestscore and jstestsaggregation. Right now, Elmo can pass 311 of the test cases from jstests. We have never tried contacting Elmo with any client driver except the mongo shell. So this probably doesnt work yet. Elmos server only supports the new style protocol, including OPQUERY, OPGETMORE, OPKILLCURSORS, and OPREPLY. None of the old fire and forget messages are implemented. Where necessary to make a test case pass, Elmo tries to return the same error numbers as Mongo itself. All effort thus far has been focused on making Elmo functional, with no effort spent on performance. How Elmo should work: In general, our spec for Elmos behavior is the MongoDB documentation plus the jstests suite. In cases where the Mongo docs seem to differ from the actual behavior of Mongo, we try to make Elmo behave like Mongo does. In cases where the Mongo docs are silent, we often stick a proxy in front of the Mongo server and dump all the messages so we can see exactly what is going on. We occasionally consult the Mongo server source code for reference purposes, but no Mongo code has been copied into Elmo. Notes on the code: Elmo is written in F, which was chosen because its an insanely productive environment and we want to move quickly. But while F is a great language for this exploratory prototype, it may not be the right choice for production, simply because it would confine Elmo use cases to Xamarin, and Miguel s world domination plan is not quite complete yet. :-) The Elmo code is now available on GitHub at githubzumeroElmo. Currently the license is GPLv3, which makes it incompatible with production use on mobile platforms, which is okay for now, since Elmo isnt ready for production use anyway. Well revisit licensing issues later. Our purpose in this blog entry is to start conversations with others who may be interested in mobile sync solutions for Mongo. Feel free to post a question or comment or whatever as an issue on GitHub: githubzumeroElmoissues Or email me: ericzumero Or Tweet: ericsink If youre interested in a face-to-face conversation or a demo, well be at MongoDB World in NYC at the beginning of June. Back in November I wrote a blog entry about performance problems resulting from the design of the layout system in Xamarin. Forms. I am pleased to report that things took a big step forward with the recent release of version 1.3. Reviewing the problem In a nutshell, the Layout classes do too much. They contain functionality to make sure everything gets updated whenever something changes. In principle, this is good, since we obviously dont want stale stuff on the screen. But in practice, there are many cases where the built-in update code ends up being slower than necessary. For example, suppose Im going to add ten child views to a layout. With the built-in update code, a layout cycle will get triggered ten times, once for each child view I add. Worse, if Im trying to do any kind of subview recycling, the odds are high that I want to add a child view while I am processing a layout cycle. This will trigger a recursive layout cycle, resulting in the end of civilization as we know it. Instead, what I want is one layout cycle which happens after all ten child views have been added. The solution I proposed IMHO, the best design for this kind of problem is to have multiple layers: The Low-Level layer models child view relationships only. It provides a way for a View to be inside another View, but it doesnt give much more than that. In iOS terms, this is UIView. addSubView. The High-Level layer (which is built on the functionality provided by the layers below it) has Views which actively manage their child views. In iOS terms, an example of this would be UICollectionView. In the Middle, it would make sense to have a layer which provides things which are common to all (or nearly all) of the stuff in the High-Level layer, to avoid code duplication. Xamarin. Forms has the High-Level layer and the Middle layer, but it does not have the Low-Level layer. So I proposed creating it. I didnt get exactly what I wanted, but. The solution in Xamarin. Forms 1.3 In Xamarin. Forms 1.3, the Middle layer is still the lowest thing weve got. However, there are new capabilities which allow the Middle layer to pretend like it is a Low-Level layer. It still has a bunch of built-in update code, but now that code can be turned off. :-) The important new capabilities are: ShouldInvalidateOnChildAdded ShouldInvalidateOnChildRemoved OnChildMeasureInvalidated By returning false from my override of ShouldInvalidateOnChildAdded() and ShouldInvalidateOnChildRemoved(), I can have a Layout which doesnt do any automatic updates when I add or remove children. And by overriding OnChildMeasureInvalidated(), I can have a Layout which refuses to do real estate negotiations with its child views. How Im using this Because of this new stuff, an upcoming release of our DataGrid component will be even faster. Our panel layout class will look something like this: This Layout class is obviously very simplistic, but it merely scratches the surface of what becomes possible now that Xamarin. Forms has something that can imitate a Low-Level subview layer. Kudos and thanks to the Xamarin. Forms team Ouch. Eric, youre one of those anti-F people, arent you If you skim this blog entry too quickly or just read the title, you might think I am someone who does not like F. Nothing could be further from the truth. Over the last several months, I have become a big F fan. It has become my preferred language for personal projects. My current side project is a key-value store in F. I have learned a lot by writing it, and I am even starting to think it might end up becoming useful. :-) Mostly, I find coding in F to be extremely satisfying. I am writing this article not as an opponent of F, but rather, as someone who hopes that F will become a mainstream language. Eric, youre wrong. F is mainstream already. Of course it is. For some definition of mainstream. F is gaining traction really fast. People are using F for real stuff. The language is improving. Xamarin is supporting it. By nearly any measure, F is showing a lot of momentum over the last few years. If you are an F fan, there just isnt any bad news running around. But for this article, I am using a definition of mainstream, (which Ill explain below) which I believe F has not yet reached. If, when you arrive at the end of this article, you do not like my definition of mainstream, thats okay. Just take a copy of this article, and do a search and replace all instances of the word mainstream with purple. I have no desire to argue with you about what mainstream means, but if you want to argue about the meaning of purple, Ill be happy to. :-) Youre wrong again. My F evangelism IS working Of course it is. To a certain extent. But in marketing terminology, as far as I can tell, most F users today are early adopters. Very few are pragmatists. And F has not yet crossed the chasm. What is the chasm The term originates from a 1991 book by Geoffrey Moore. The main point of Moores book is that the classical marketing bell curve has a problem. Typically (and, prior to Moores book, always), that bell curve is drawn like this: The basic idea of this curve is that when a market adopts a new techology, it follows a pattern. The technology moves from left to right on the bell curve, becoming adopted by four groups in the following order: the early adopters (people who like trying new technologies) the pragmatists (people who only care about technology to get something done) the conservatives (pragmatists, but even more risk-averse) the laggards (people who actively avoid new things) Together, the pragmatists and conservatives are the definition of mainstream for the purpose of this article. Moores key observation is that moving from the early adopters to the pragmatists is very hard. Some technologies never make it. To illustrate this problem, Moore suggests drawing the bell curve differently, with a chasm between the early adopters and the pragmatists: His book explains why the chasm exists, why some technologies die at the bottom of the chasm, and how some technologies successfully cross the chasm. It is a marketing classic and highly recommended. For the purpose of this blog entry, the main thing you need to know is this: The chasm exists because pragmatists generally adopt new techologies as a herd. They dont adopt a new technology until they see other pragmatists using it. This creates a chicken-and-egg problem. How does this herd thing work Pragmatists have an annual conference where they all agree to stay with their existing technologies. The actual vote is not formal, but consensus gets reached. A lot of this process happens in hallways and the dining hall: Are you considering Windows 8 or should we all just stay with Windows 7 and see what happens next Some of the process happens in the conference itself, where youll see session titles like, Why its safe for you to ignore mobile for another year. At PragmatiCon 2014, the ratified platform looked something like this: SQL is still the only safe choice. Keep an eye on your developers to make sure theyre not using Ruby. Exchange is still the best email solution. The cloud is okay for some things, but important data needs to stay in your own server room. Lets ignore BYOD and hope it goes away. Building a mobile app is still too expensive and too risky. So the pragmatists dont care about the ways that F is better This point is where the title of this blog entry comes from. If you are trying to explain the benefits of F to pragmatists, you are probably frustrated. It probably seems like theyre not listening to you. Thats because theyre not. Pragmatists dont make technology decisions on the basis of what is better. They prefer the safety of the herd. A pragmatist wants to be using the same technology as all the other pragmatists, even if everybody is somewhat unhappy with it. They will choose predictably disappointing over excellent and unproven every time. Maybe we just need to do a better job of explaining the benefits of F Wouldnt it be great if it were that simple But no. As an early adopter, there is nothing you can say to a pragmatist that will make a difference. They know that your opinion and experience are not to be trusted, because they do not share your values. So these pragmatists are just stupid then Not at all. Their decision-making process is quite rational. It is a natural consequence of being someone who uses technology to get something done rather than using technology for its own sake. Near the top of this blog entry, I said that I find coding in F to be extremely satisfying. That remark identifies me as an early adopter. It is something a pragmatist would never say. If any pragmatists accidentally stumbled across this blog entry, they stopped reading right there. Pragmatists dont care about the craft of software. They dont care about how cool something is. They care about cars and investments and law and soap and oil rigs and health care and construction and transportation and insurance. Technology is just a tool. BTW, if you find the word pragmatists to be too tedious to pronounce, you can just refer to these folks by their more commonly-used label: normal people. غرامة. We dont need those pragmatists anyway, right Maybe not. Some things stay in the land of early adopters forever. But the area under the bell curve matters. It is roughly equivalent to revenue. Together, the pragmatists and conservatives represent almost all of the money in the market. If your situation allows you to be successful with a given technology even though it only gets used by early adopters, great. But many people are (directly or indirectly) placing bets (financial or otherwise) which will only pay off when their technology get used by the majority of the market. So this chicken-and-egg situation is hopeless then Sometimes a pragmatist can be convinced to break with the herd. The key is to find what Moore calls a pragmatist in pain. A pragmatist in pain is someone whose needs are not being well met by whatever technology is current popular among pragmatists. The current technology is not merely annoying them. It is failing them. A pragmatist in pain actually does care about how F is better, even though this goes against their nature. They really hate the idea of listening to some F nerd prattle on about immutability and type inference. But they have reached their last resort. Their pain has forced them to look for hope from somebody outside the herd. This is how a new product gets across the chasm. Find a pragmatist in pain. Do whatever-it-takes to make them happy with your product. Then go back and do it again. Repeat until you have enough customers that they can go to PragmatiCon without being shunned and ridiculed. Why will it be especially hard for F to cross the chasm Because C is really, really good. I love C, but I hold the opinion that F is better. I also understand that Fs awesomeness is basically irrelevant to the question of whether it will go mainstream or not. If the pragmatists are not in pain, they are not interested. C doesnt cause very much pain. Will the hybrid functional-first languages cross the chasm together Certainly it is true that F is part of a trend. The Java world has Scala. The AppleiOS world has Swift. It is not merely true that F is gaining momentum. It is also true that functional programming is gaining momentum. But in terms of going mainstream, these three languages will be related-but-separate. If Swift cross the chasm first (and it will), that will add a bit more momentum to F, simply because the two languages will be seen as comparables in different ecosystems. But F will have to cross the chasm on its own. Why will Swift go mainstream before F Yes, F has a seven year head start, but Swift will cross the chasm first. This has nothing to do with the relative merits of these two languages. As of January 2015, F is quite stable and trustworthy for most use cases, while Swift is mostly an unstable mess that isnt ready for prime time. This too is irrelevant. The simple fact is that C is kinda great and Objective-C is kinda dreadful. Swift will go mainstream first because you cant swing a 9-iron in the AppleiOS ecosystem without hitting a pragmatist in pain. Eric, youre wrong. I know some pragmatists who are using F. Really Great Please spread the word.

No comments:

Post a Comment