איך לחשוף פיצ'ר רק למספר יוזרים מוגבל

jamesgolick/rollout – GitHub.

הג'ם בקישור למעלה מרשים מאוד.

הוא נותן אפשרות לחשוף פיצ'ר למספר מוגבל של יוזרים על בסיס חוקים מאוד ברורים, אפשר לחשוף לפי Role, אפשר לחשוף לאחוזים מסויימים.

היתרון של הג'ם הזה הוא שהוא מבוסס על Redis ולכן הסקייל הוא הרבה יותר טוב מאשר משהו מבוסס על mysql.

פורסם בקטגוריה Ruby On Rails, קישורים | להגיב

הכנת המק שלך לעבודה עם רובי און ריילס

כמו שכול מי שקורא את הבלוג שלי יודע, אני עובד עם מק, ואני עובד עם רובי און ריילס.

כך גם בגוגובוט, לכולם יש מק, וכולם עובדים עם רובי וריילס.

כאשר עובד חדש מגיע לחברה, הוא מקבל לפטופ חדש לבחירתו (מק כמובן, בלי שטויות).

אחת הבעיות הגדולות שנתקלנו בהן בשנה האחרונה הייתה Setup של המכונות האלה לסביבת הפיתוח שלנו שכוללת הרבה מאוד דברים, חלקם ספציפיים אלינו וחלקם ממש לא.

העבודה הזו היא סתם סיזיפית, לא מעניינת ואין לה שום ערך למפתח החדש, אז חשבתי, איך אנחנו יכולים לשפר את זה.

לפני בערך חודש, קיבלתי לפטופ חדש, זו הייתה הזדמנות מצוינת לקפוץ למים העמוקים ולייעל את התהליך הזה.

בת'כלס, זה סקריפט שנבע מעצלנות אבל למי אכפת :-) (אל תגלו לאף אחד)

את הסקריפט (שהוא בסה"כ שורת Shell יחידה) אפשר למצוא כאן: gogobot/laptop – GitHub.

הייתי מספר לכם מה הוא עושה, אבל הכול נמצא בReadme, בגדול אחרי בערך חצי שעה-שעה יש לכם מכונה שמוכנה לעבודה עם כול הStack מותקן.

נקודה לציון: הסקריפט נבדק על מק בלבד, על מכונה חדשה בלבד, בלי שום דבר שהיה מותקן על המחשב לפני.

הערות, הארות, רעיונות לשיפור, אפשר להגיב כאן, אפשר לפתוח Issue בGithub מה שבא לכם.

פורסם בקטגוריה Ruby On Rails, כללי, קישורים | עם התגים , , , , , | להגיב

תוציאו הכול (כמעט) לקוד פתוח

את הפוסט הבא קראתי ממש כשיצא.

אני מאוד מאמין במה שטום מנסה להעביר כאן, אני מתנהג ככה בכול הפרויקטים שלי, כולל בGogobot.

כול מה שלא נוגע ללוגיקה הישירה ולמהות של החברה, יוצא לOpen Source, כול מה שאנחנו נוגעים בו ויכול לתרום לפרויקט המקורי, יוצא גם הוא לOpen Source.

למשל…
כאשר התחלנו לעבוד עם Resque היה לנו ממש חסר פיצ'ר שיכול להוסיף משימות לQueue מאוד דומה לDelayed Jobs.

לכן, כתבנו כזה, הדבר הראשון שעשינו אחרי שכתבנו, היה להוציא את זה לOpen Source.

מאז לדאבוני לא התמדנו עם דוקומנטציה ויש עוד שיפורים שצריכים להכנס לקוד, אבל זו בהחלט הדרך שבה אני מאמין.

קישור לפוסט של טום למטה.

Open Source (Almost) Everything.

פורסם בקטגוריה Ruby On Rails, כללי, מחשבות, קישורים | עם התגים , , , | להגיב

Best practices לעבודה עם צד לקוח בריילס

הקדמה – למה כדאי לכם להמשיך לקרוא גם אם אתם לא מתכנתי רובי און ריילס

אמנם הפוסט הזה הולך לדבר על Best Practices דרך דוגמאות בריילס, אבל בהחלט אפשר לקחת את ה-Best Practices האלה וליישם אותם על כל אחת מהטכנולוגיות האחרות שאתם עובדים איתן, בין אם אתם עובדים ב-Php או אפילו דוט נט, אפשר ליישם את הפתרונות האלה בקלות יחסית.

סדר וארגון מביאים ליעילות ולכן, לחסכון בכסף ובזמן

בליבה של רובי און ריילס יש לנו את MVC, שמכריחה את המפתח (אלא אם הוא עקשן מאוד) לעבוד בצורה נכונה ולארגן את קוד צד השרת שלו למקומות הנכונים, להשתמש ב-Helpers וכן הלאה.

אם אתם מתכנתי Web סביר מאוד להניח שיש לכם עשרות, אם לא מאות, ואם לא אלפים שורות קוד לכתוב ב-JavaScript וב-Css. סביר גם להניח שיש לכם מספר גדול מאוד של קבצים לעבוד איתם.

אם אי פעם עבדתם על פרויקט בסדר גודל בינוני עד גדול, אתם יודעים בדיוק כמה קל לאבד את הידיים ואת הרגליים ולא להבין איפה יושב קוד X ואיפה יושב קוד Y, ואז מתחילים לשאול שאלות ומתחילים להתחלף מיילים ששואלים איפה X מבצע את Y ולמה.

אחד הדברים הראשונים שאני עושה בפרויקט, בין אם אני מתחיל אותו מאפס ובין אם אני עובד עם פרויקט שכבר בריצה, זה להניח כללי יסוד וחוקים של איך קוד צריך להיות מאורגן, הן בצד לקוח והן בצד שרת. במרוצת השנים ועם הנסיון, אני חושב שעליתי על דרך מאוד נוחה, בריילס הבאתי אותה לשלמות (בשבילי כמובן) וחשבתי שכדאי שאשתף אתכם (כהרגלי בקודש) בשיטה הזו.

ארגון CSS צריך להיות מבוסס על Controllers

התמונה למטה, מראה רשימת Controllers טיפוסית בפרויקט תו"כ פיתוח.

רשימת Controller בפרויקט

רשימת Controller בפרויקט

קונטרולרים בפרויקט בדרך כלל נותנים לנו מושג מעולה איך פרויקט בנוי, ולכן אני משתמש ברשימת הקונטרולרים בשביל לארגן את קבצי ה-Css שלי.

אבל ראשית, יש לי כמובן קובץ Css ראשי אחד, שבו יש את כול החוקים שהם משותפים לכול האתר, לקובץ ה-Css הזה אני בד"כ קורא main.css (מיד נראה איך הכול מאורגן בתיקיות כמובן).

להלן ספריית ה-Css שלי בהתבססות על הקונטרולרים. שימו לב לדבר אחד, אני משתמש ב-Compass וב-Scss בשביל לכתוב את הקוד, ולכן הקבצים הם לא רגילים. כמו כן, כאן הקובץ הראשי שלי נקרא dashboard.css מכיוון שהפרויקט הוא אפליקציה ולא אתר.

קבצי Css

קבצי Css

שימו לב לדבר נוסף, הקלאס הראשי בתוך הקובץ הוא בשם הקובץ שלי ולכן בשם הלוגי של המקום שבו הוא נמצא.

שימוש בקלאס ראשי לארגון התוכן הפנימי של הדף

אם נסתכל על הקובץ Layout הראשי שלי, אנחנו יכולים לראות איפה אני משתמש בקלאס הזה

	<body class="<%= controller_classes.join(' ') %>">
		<div class="wrapper">
			<div class="header <%= yield(:header_class)%>">
	    		<%= yield(:upper_links) %>
		   		<%= yield(:dashboard_header) %>
				<%= yield(:top_button) %>
		    </div><!--/header-->
		    <div class="content">
				<%= yield %>
		    </div><!--/content-->
			<%= yield(:new_issue) %>
		</div><!--/wrapper-->
		<div class="footer">
			<%= render :partial => "shared/dashboard/footer" %>
		</div><!-- .footer -->

		<%- flash.each do |name, msg| -%>
			<div id="flash_message" class="flash <%=name%>">
				<strong>
					<%= msg %>
				</strong>
			</div>
      	<%- end -%>
	</body>

שימו לב לקלאס של ה-Body הוא נלקח מקוד ומשם הוא קובע את ה-Class של כל עמוד בנפרד. כך למשל, אם יש חלקים שצריכים להראות שונה בין עמוד לעמוד, מאוד קל לבצע את זה.

את ה- controller_classes אני קובע דרך ה- application_helper בצורה הבאה:

module ApplicationHelper
  def controller_classes
    [controller.controller_name]
  end
end

למה זה מערך?

למי שמכיר רובי או שפות עם סינטקס דומה, בטח זיהה שמדובר במערך. הסיבה שזה מערך נוגעת לכך שאני יכול לעשות לו מניפולציה, להוסיף לו אלמנטים ולהוריד לו אלמנטים בצורה קלה מאוד, מה שעם מניפולציה על String היה הרבה יותר מלוכלך בקוד.

עכשיו, אתם בטח תוהים איך אני לוקח את כול קבצי ה-Css האלה. העוקצנים שבינכם בטח כבר חשבו למה אני טוען Css בכול עמוד בנפרד במקום קובץ אחד ויחיד שהוא Minified. ובכן, לא כך המצב. אני אכן טוען את כול הקבצים לתוך קובץ אחד ויחיד (ב-Production) שהוא Minified וגם gzipped.

אני מבצע את הדבר הזה דרך Gem שנקרא Jammit שעושה בדיוק את זה, הGem משתמש בקובץ Yaml בשביל לאחד את הקבצים, היופי ב-Gem הזה שבזמן פיתוח הוא נותן לי את כול הקבצים בצורת המקורית (אחרי ש-Compass עשה מהם Css רגיל), ובזמן Production מוגש קובץ אחד ויחיד.

אפשרות נוספת היא לעשות שימוש ב-Import של Sass, במקרה הזה הקבצים צריכים להתחיל עם Underscore ופשוט לייבא את כולם לתוך קובץ יחיד שנקרא לו application.scss או כל שם אחר שבא לכם.

דוגמא ל-Jammit Asset file

stylesheets:
  base:
    - public/stylesheets/base/all.css
    - public/stylesheets/base/form.css

ארגון קבצי JavaScript

ארגון קבצי ה-JavaScript דומה להחריד לארגון קבצי ה-Css, אלא שבמקרה הזה, אני טוען שני קבצים לתוך ה-Html.

הקובץ הראשון הוא הקובץ הכללי שכולל בתוכו קוד כללי לכול העמודים (אם יש כזה), כולל את ה-Framework לבחירה (Mootools כמובן) ועוד תוספים כאלה ואחרים.

להלן דוגמא:

javascripts:
  base:
    - public/javascripts/base/mootools-core-1.3.js
    - public/javascripts/base/mootools-more.js
    - public/javascripts/base/rails.js
  dashboard_base:
      - public/javascripts/base/flash_hanler.js
      - public/javascripts/base/scroller_bar.js
      - public/javascripts/base/behavior.js
      - public/javascripts/base/custom_select.js
      - public/javascripts/base/custom_checkbox.js
      - public/javascripts/base/paging_list.js
      - public/javascripts/base/new_project.js
      - public/javascripts/base/project.js
      - public/javascripts/modules/project/newIssue.js
      - public/javascripts/base/main.js

כפי שניתן לראות, יש כמות גדולה יותר של קבצים שנטענים בהתחלה, כמובן שכולם מאוחדים לתוך קובץ אחד ויחיד בזמן Production ומוגשים minified וgzipped.

בנוסף, לכול אחד מה-controllers יש קובץ משלו. למשל home.js, user.js ועוד.

את הקובץ הזה אני טוען בתחתית העמוד מיד אחרי קובץ הBase בצורה הבאה:

<%= javascript_include_tag "/javascripts/views/#{controller.controller_name}.js" %>

האתר שלי הרבה יותר עשיר בJavaScript, רעיון לשיפור?

בהחלט, כרגע אנחנו עובדים ב-controller scope, אפשר בהחלט לעבוד ב-view scope ולייצר קבצים (גם Js וגם Css) לכול אחד מה-Views שלכם ול-Partials.

אני באופן אישי עושה את זה בפרויקטים יותר עשירים בJs, כאלה שהם ממש אפליקציות שבנויות על עשרות רבות של קבצים, אבל ברוב הפרויקטים וברוב האפליקציות שאני בונה, controller scope בהחלט מספיק  לי ועושה את העבודה יותר מטוב.

הערת שוליים קטנה או => נראה לכם באמת שאני עובד ככה…

אתם בטח חושבים לעצמכם, אין מצב, זה נראה יותר מדי עבודה, לך תזכור להוסיף את הקבצים במקום ולך תזכור לטעון אותם וכהנה וכהנה הערות. ובכן, אחד הדברים ששברו אותי בתחילה כאשר התחלתי עם השיטה הזו אכן היה הנושא של הניהול, בעיקר ביצירת הקבצים וניהול של ה-Minify והטעינה לתוך Jammit

מי אמר Rails Custom Generators?

בדיוק בשביל זה יש לי Custom Generator ובמקום ליצור Controller דרך הקומנד ליין הרגיל, אני יוצר אותו דרך Custom Command שבעצם עושה את כול הדברים בשבילי.

  • יצירת Controller
  • יצירת קובץ Scss
  • הוספה של הקובץ לסדר הMinify (פרמטר אופציונאלי האם הוא בייס או לא)
  • הוספה של קובץ Js
  • הוספה של הקובץ לסדר הMinify (פרמטר אופציונאלי האם הוא בייס או לא)

לסיכום

אשמח לשמוע תגובות, הערות, הארות (אני פתוח לכול ביקורת חיובית :-) )

לייקים בפייסבוק וגם תגובות דרך הפייסבוק יתקבלו גם הן בברכה.

בהצלחה!

פורסם בקטגוריה Javascript, Ruby On Rails, כללי, פיתוח צד לקוח | עם התגים , , , , , , , | להגיב

אתר מאפס ברובי און ריילס #3 (סקרינקאסט)

החלק השלישי בסדרה, בחלק זה אני עובר על יצירת מודלים לנתונים, יצירת מבחנים למודלים האלה ועל קשרים בין מודלים ב-ActiveRecord.

בחלק זה, לא פתחתי דפדפן אפילו פעם אחת ועדיין יכולתי לראות איך אני יוצר "משאלה", תורם לאותה משאלה ומשייך את התרומה לתורם מסוים ואף מסמן אם היא אנונימית או לא.

תהנו,
כרגיל, אשמח לתגובות ולייקים.

דרך אגב, בסקרינקאסט הזה אני משתמש במיקרופון חדש ובתוכנת הקלטה חדשה, אשמח לשמוע רשמים על האיכות לעומת הקודמים.

Creating a rails application from scratch #3 from Avi Tzurel on Vimeo.

כמובן כרגיל, קוד המקור נמצא ב-Github ואתם יכולים לשכפל אותו ולעשות איתו כרצונכם, השימוש הוא חופשי לגמרי.
https://github.com/KensoDev/Adopt-A-Cause

מוזיקת הפתיח מאת http://www.danosongs.com/

פורסם בקטגוריה Ruby On Rails, כללי | עם התגים , , , , , | להגיב

לקוח חדש – GogoBot

לאחרונה התחלתי לעבוד עם חברה אמריקאית בשם GogoBot. החברה פיתחה אפליקציה שמקשרת בין גולשים מכל העולם ומאפשרת להם לתכנן את טיולם בצורה קלה, נעימה ומעניינת.

הסרטון הבא יסביר בקצרה על חברת GogoBot – מה הם עושים, צוות העובדים ועוד.

הנה הסבר מטעם מנכ"ל החברה ואחד המייסדים, טרוויס כץ.

העבודה שלי

  • פיתוח רובי און ריילס
  • פיתוח אלגוריתם להשוואת בסיסי נתונים
  • פיתוח צד לקוח
פורסם בקטגוריה Ruby On Rails, כללי | עם התגים , , , | להגיב

אתר מאפס ברובי און ריילס #2 (סקרינקאסט)

כזכור לכולם, בפוסטים הקודמים כתבתי על מיזם חברתי חדש שאני עובד עליו, שבאמצעותו אתרום לשתי קהילות במקביל וכל זה בעזרת רובי און ריילס – איך תורמים לשתי קהילות במקביל עם רובי און ריילס ואתר מאפס ברובי און ריילס #1.

זהו החלק השני בסדרה, שבו הוספנו את מודל ה-User כולל את האפשרות שמשתמשים יבצעו Login, Forgot Password ועוד.

כמו כן, הראינו איך בדיוק מוסיפים טסטים למודלים ואיך מבצעים מיגרציות לבסיס הנתונים.

אשמח לתגובות (גם דרך הפייסבוק) וכרגיל לייקים יתקבלו בברכה גם כן.

תהנו!

Creating a rails application from scratch #2 from Avi Tzurel on Vimeo.

פורסם בקטגוריה Ruby On Rails, כללי | עם התגים , , , , | 2 תגובות

אתר מאפס ברובי און ריילס #1 (סקרינקאסט)

כזכור לכולם, בפוסט הקודם כתבתי על מיזם חברתי חדש שאני עובד עליו שבאמצעותו אתרום לשתי קהילות במקביל וכל זה בעזרת רובי און ריילס.
זהו החלק הראשון מתוך סדרה של סקרינקאסטים שאנחנו עושים ובאמצעותו תוכלו ללמוד כיצד לבנות אתר מאפס באמצעות רובי און ריילס.

Creating a rails application from scratch (pt 1) from Avi Tzurel on Vimeo.

הסרטון נקטע לנו פעמיים, פעם אחת באמצע ופעם אחת בסוף, אני אשלים את מה שלא הספקתם לראות בגלל שהסרטון נקטע.

בחלק האחרון של הסרטון יצרנו את ה-Title המתאים לעמוד ה-Index בController => Home.

לאחר ששמרתי את הקובץ פשוט הרצנו את הבדיקות מחדש וכול הבדיקות עברו כמו שצריך. לכן, בעצם בכך סיימנו את היעד לסרטון הראשון.

בסרטונים הבאים, נמשיך וניצור את האתר כמובטח.

קישורים מהסרטון:

https://github.com/ryanb/nifty-generators
http://rspec.info/
https://github.com/thoughtbot/factory_girl
http://gembundler.com/

נשמח לתגובות, לייקים ושיתופים.

פורסם בקטגוריה Ruby On Rails, כללי | 7 תגובות

איך תורמים לשתי קהילות במקביל עם רובי און ריילס?

בשבועות האחרונים בוער בתוכי מיזם חברתי. היות ואני בסה"כ מפתח תוכנה, כמובן שהמיזם החברתי שלי יהיה קשור לזה בצורה כולשהי.

על המיזם החברתי

dollar and Donation Box
המיזם הוא אתר אינטרנט. האתר יאפשר לכול מי שרוצה לגייס כסף לכול מטרה לעשות זאת בקלות.

כולנו מכירים את הקבוצות בפייסבוק לילדים חולי סרטן לא עלינו או למשפחות נזקקות. האנשים האלה בדרך כלל עומדים מול שוקת שבורה בגיוס כספים, מכיוון שאין להם את הכוח להרים לוגיסטיקה שכזו, גם כך יש להם מספיק על הראש.

לכן, החלטתי להקים את אתר "אמץ מטרה" (השם זמני). האתר יאפשר לכול מי שחפץ לפתוח "מטרה", אנשים מהישוב יוכלו להכנס לאתר, לבחור להם מטרה ולתרום לה כסף או לאמץ אותה.

אימוץ מטרה אומר למשל שאני בוחר לשלם כול חודש 150 שקלים לטובת משפחת XYZ מישוב YZF. בכך בעצם אני דואג להכנסה קבועה למשפחה מכמה תורמים.

כמובן שאני יכול לתרום בצורה חד פעמית ולא חייב בשום צורה להתחייב לתקופה כולשהיא.

כול מי שתורם יוכל (אם ירצה) לפרסם את התרומה שלו על ה-Wall בפייסבוק ובכך להפיץ את השמועה ולעזור למטרה שהוא בחר בכך שגם החברים שלו יעזרו לאותה המטרה.

אפשר כמובן יהיה לתרום אנונימית וששמך לא יוזכר ברשימת התורמים ולא יפורסם בשום מקום, ההחלטה היא של התורם בלבד.

חשוב להבין, המטרות באתר יהיו מגוונות. כך למשל יוכל גם תלמיד תיכון שההורים שלו לא יכולים להרשות לעצמם את הטיול לפולין, להעלות מטרה ולבחור לגייס אליה כסף.

רגע? אין אתרים כאלו?

אז כן, יש כאלו אתרים – בעולם יש כאלה כמו pledgie.com ואפילו Facebook Causes, אבל הם לא חשופים לקהל הישראלי שלטובתו אני מרים את האתר הזה, לא תמיד גם האנשים שזקוקים לעזרה יודעים אנגלית ולכן אני רוצה להנגיש את האתר בצורה הכי גבוהה שאפשר.

אודות האתר

האתר יהיה חינמי לחלוטין, כול עלויות האכסון הן עלי, כול עלויות הפיתוח והעיצוב הן עלי. האתר יגבה את הכסף ויעביר אותו במלואו למשפחה, לפותח המטרה, לא תהיה גביית עמלות או קיזוז של כסף בשום שלב שהוא במערכת.

צילומי מסך מה-Mockups

דף פנימי - מטרה, תורמים, שיתוף

דף פנימי - מטרה, תורמים, שיתוף

כניסה לאתר, גם דרך פייסבוק וטוויטר

כניסה לאתר, גם דרך פייסבוק וטוויטר

מה זה קשור לריילס ואיך זה תורם לשתי קהילות?

טוב, אז קודם כול, האתר כולו יהיה ברובי און ריילס, הערך המוסף הוא שאת כול התהליך של בניית האתר, אני הולך לצלם ולהקליט ביחד עם אריה גלזר. בעצם, במקום שאני אצלם את כול הסרטונים לבד כמו שאני רגיל בד"כ ואתם רגילים לראות כאן בבלוג, אנחנו נעשה את זה ביחד והתהליך יהיה כולל המון שאלות שאריה ישאל ובכך יגדיל את היעילות של השיעורים.

יהיה קוד פתוח?

כן, האתר יהיה בקוד פתוח, כולו יפורסם (גם תו"כ תהליך העבודה) ב-Github ותוכלו להיחשף לקוד שלו ולראות איך אנחנו מתקדמים.

השאיפה שלי היא ליצור בכול שבוע סרטון של שעה-שעה וחצי ובכך לייצר התקדמות טובה מאוד ולהרים אתר לאוויר בתקופה יחסית קצרה.

מה אנחנו צריכים מכם?

בעיקר אנרגיות, שתגיבו לסרטונים, שתחוו דעתכם (גם על הפוסט הזה), תנו לנו לייקים ותעזרו לנו להפיץ את המיזם החברתי הזה.

שיהיה לכולנו בהצלחה!

החלק הראשון

אפשר למצוא כבר את החלק הראשון של הסרטונים בקישור הזה

פורסם בקטגוריה Ruby On Rails, כללי, מחשבות | 5 תגובות

סקרינקאסט Ajax עם מוטולס ורובי און ריילס (חלק 1)

בסקרינקאסט הבא אני עובר על יצירת פרויקט חדש ברובי און ריילס.

בפרויקט הזה נבצע משימה פשוטה, נייצר אפליקציה שמאפשרת לנו ליצור פרויקט חדש ולהזין לו שם, לא משהו מסובך מדי.

אחרי שביצענו את זה בדרך הרגילה שאנחנו מכירים נראה איך אנחנו מבצעים Ajaxify לטופס הזה ויוצרים התנהגות נוספת על בסיס ההתנהגות הרגילה.

בעצם כך אנחנו מרוויחים את ההתאמה גם למי שאין לו JavaScript או JavaScript עדיין לא מוכן, הטופס יעבוד בכול מקרה.

אשמח כמובן לראות תגובות (גם דרך הפייסבוק)

גם לייקים יתקבלו בברכה

Ajax on rails using Mootools [HD] from Avi Tzurel on Vimeo.

את קוד המקור של האפליקציה (לשלב הזה) אפשר למצוא כאן, כאשר אצלם את הסקרינקאסט הבא, קוד המקור יעודכן ותוכלו להתעדכן

פורסם בקטגוריה Javascript, Ruby On Rails, פיתוח צד לקוח | עם התגים , , , , , | להגיב