text:
Robert Fox
home_outline/People/Faculty/Lecturer & Visitors/Robert Fox
drbobfox@umich.edu(248) 930-3199
IOE 837, Ergonomics Principles continuing education short course
Manual Material Handling, work-related musculo-skeletal disorders assessment, intervention and prevention
NIOSH Healthy Work Design and Workplace Design Council, December, 2020.
Certified FIRST Tech Challenge middle school competitive robotics judge (November 2019).
International Ergonomics Association, MSDs Technical Committee, since 2019.
Consultant, ACGIH Physical Agents Committee (PAC) since 2019.
Full member, Human Factors & Ergonomics Society, ID# 11719. Member since 1985, member of occupational ergonomics and aging technical groups.
Occupation Ergonomics and Human Factors Advisory Panel, Institute of Industrial and Systems Engineering, IISE Transactions, starting May 2019.
Associate Editor, Editorial Board, Ergonomics in Design, term started January, 2019.
Peer reviewer for Ergonomics in Design, International Journal of Industrial Ergonomics, IISE Transactions and Applied Ergonomics
Chair of US ISO Technical Advisory Group/ISO Technical Committee 159, Subcommittee 3 (anthropometry and biomechanics) for the review and creation of international standards related to ergonomics. Participation in TC 159/SC3 Working Group 4 (Human Physical Strength – Manual Handling and Force Limits) writing/editing proposed standards for lifting/lowering, pushing, pulling, upper extremity repetitive activities and other topics.
Chair, Human Factors and Ergonomics Society (HFES) Technical Standards Division, Ex-Officio member of the HFES Executive Council (oversee all ergonomics and human factors-related standards activities for HFES including all ISO ergonomics standards and ANSI-HFES 100 Human Factors Engineering of Computer Workstations). Have worked to raise awareness of HF/E standards work within the Society and promote involvement in standards with HFES membership. Have worked to establish better lines of communication and involvement between HFES, ISO and other scientific bodies such as the ACGIH Physical Agents Committee. 2014 – 2020.
Member, International Ergonomics Association Technical Committee on MSDs
Member, ASTM technical committee F48 Exoskeletons and Exosuits,
Bob Fox has 40 years of experience in the field of ergonomics, human factors and physical anthropology. He has worked in General Motors North American and global ergonomics activities from 1993 until May of 2022 and is both an HFES and IEA Fellow. He chairs the US Technical Advisory Group (TAG) to the International Standards Organization (ISO) for anthropometry and biomechanics and participates in various work groups for ANSI and ISO ergonomics standards and reports. He participates on the NORA Cross-Sector Councils for both MSDs and Healthy Work Design, the ACGIH Physical Agents Committee, the IEA Technical Committee on Musculoskeletal Disorders, USCAR and the ASTM F48.02 subcommittee on Human Factors and Ergonomics for exoskeletons. He has authored journal articles on manual material handling, the Revised NIOSH Lift Equation, work-related musculoskeletal disorders and ergonomics and aging. He has been a Certified Professional Ergonomist (CPE) since 1996.
Areas of Interest and Expertise:
General automotive industrial ergonomics
Manual material handling – lifting, pushing/pulling, carrying
Upper extremity repetitive motion/MSD risk analysis and prevention
Warehousing and indirect labor ergonomics
Industrial mobile equipment ergonomics
Awarded Fellow of the International Ergonomics Association (IEA), July 2022.
Bullard-Sherwood Research to Practice (R2P) Award for Achievements as Chair of ISO TC159/SC3 WG4 writing group, NIOSH in 2021, January 2022.
Article "Understanding Outcome Metrics of the Revised NIOSH Lifting Equation," nominated for CDC Shephard Award, October 2019.
2018 Team Award in recognition of contributions and collaboration as member of the United States Consortium for Automotive Research (USCAR) Ergonomics Task Force, May 2019.
Elected Fellow of the Human Factors and Ergonomics Society (HFES), October 2017.
2015 Team Award for Force Mat Measurement Insertion research project, United States Consortium for Automotive Research (USCAR), May 2015.
Distinguished Service Award, Board of Certification for Professional Ergonomists (BCPE), October 2014
Election to Industrial Engineering Academy in recognition of outstanding achievements in industrial engineering, Department of Industrial Engineering, Texas Tech University, Lubbock, TX April 2011.
HFES Diversity Message for Indigenous Persons Month," Bob Fox, November 2022, https://www.hfes.org/HFES-News/hfes-diversity-message-for-indigenous-persons-month
"Work-related Musculoskeletal Disorders," Ming-Lun Lu, Brian D. Lowe, Ninica L. Howard, Alysha R. Meyers, Robert R. Fox, Ren G. Dong, and Brent A. Baker, book chapter 14 in Modern Occupational Diseases Diagnoses, Epidemiology, Management and Prevention, Ki-Moon Bang (ed.) Bentham Science Publishers, 2022. https://doi.org/10.2174/97898150491381220101.
Handbook of Human Factors and Ergonomics (5th Ed.), G. Salvendy and V. Karwowski, Editors, Chapter 50, "Human Factors and Ergonomics Standards," W. Karwowski, R. Taiar, R. Fox. John Wiley & Sons, Hoboken, NJ, 2022.
"A calculation approach of biomechanical overload, derived from OCRA-RNLE methods, with daily cycle, extended to multitask jobs featuring macro-cycles: the MultiGEI (The Multitask General Exposure Index)," Columbini, D., Occhipinti, E., Fox, R.R., Alvarez-Casado, E., Michaloski, A.O. International Journal of Industrial Ergonomics, 86, 2021, 103212.
"Human Factors and Ergonomics Society Policy Statement on Occupational Ergonomics for Industry 4.0," Contributor, Approved and posted October 3,2020. https://www.hfes.org/Portals/0/Documents/Government%20Relations/HFES%20Policy%20-%20Occupational%20Ergnomics%2011.11.2020%20-%20FINAL.pdf?ver=2020-11-11-130626-293
"Understanding Outcome Metrics of the Revised NIOSH Lifting Equation," Fox, R., Lu, M.L., Occhipinti, E., Jaeger, M., Applied Ergonomics, 10, 2019. Note: Paper nominated in October 2019 for CDC Shepard award.
https://doi.org/10.1016/j.apergo.2019.102897
"Human Factors and Ergonomics Society Policy Statement on Airline Seating," as HFES Chair of the Technical Standards Division, headed an interdisciplinary team to produce it. Approved and posted April 2019. https://www.hfes.org/public-policy/hfes-public-policy.
NATIONAL OCCUPATIONAL RESEARCH AGENDA FOR MUSCULOSKELETAL HEALTH, CDC/NIOSH, October 2018, Contributor, https://www.cdc.gov/nora/councils/mus/pdfs/National-Occupational-Research-Agenda-for-Musculoskeletal-Health-October-2018.pdf
"The Revised ISO Standard 11228-1 on Manual Lifting, Lowering and Carrying: Special Focus on Extensions of the Revised NIOSH Lift Equation and a Strategy for Interpretation," Robert R. Fox, Proceedings of the 20th Congress of the International Ergonomics Association (IEA 2018), Vol. III – Musculoskeletal Disorders, S. Bagnara et al. (Eds.): IEA 2018, AISC 820, pp. 154–158, 2019.
https://doi.org/10.1007/978-3-319-96083-8_19.
"Variable Lifting Index (VLI): A New Method for Evaluating Variable Lifting Tasks," Waters, T., Occhipinti, E., Colombini, D., Alvarez-Casado, E. and Fox, R., Human Factors, Vol. 58, No.5, pp. 695-711, August 2016. http://journals.sagepub.com/doi/full/10.1177/0018720815612256
SAE/USCAR-41 Ergonomics Guidelines for Carts and Dollies, principle author, Society of Automotive Engineers International/United States Consortium for Automotive Research, Detroit, MI, March 2015.
SAE/USCAR-42 Ergonomics Guidelines for Small Lot Delivery Operations, principle author, Society of Automotive Engineers International/United States Consortium for Automotive Research, Detroit, MI, March 2015.
"Aging Workers & Ergonomics: A Fresh Perspective," Professional Safety, Vol. 60, No. 1, pp. 33-41, January 2015 (Robert R. Fox, George E. Brogmus, Wayne S. Maynard). http://www.mywarehouseonline.com/graphics/0427/168008_ASSE_012015_dn.pdf
"A Psychophysical Study of High-Frequency Arm Lifting," International Journal of Industrial Ergonomics, Vol. 44, Issue 2, March 2014, pp. 238-245 (Robert R. Fox, James L. Smith).
OHS-8 Rotated Operator Compartments in Lift Trucks: An Ergonomic Review, Automotive Industry Action Group (AIAG), Southfield, MI, Version 1, March 20, 2008
"Why the United States Needs its Seat at the ISO Table," Actionline – The Magazine of the Automotive Industry Action Group, pp. 14-18, July/August 2007 (Bob Fox, Bruce Main and David Felinski).
"Standards Update – Anthropometry and Biomechanics," HFES Bulletin, vol. 50, no. 6, June 2007, pp. 6-7.
OHS-5 – Ergonomics Guidelines for Small Lot Delivery Systems, R. Fox, principle author, Automotive Industry Action Group (AIAG), Southfield, MI. Version 1.0 issued 12/2006.
"Shake, Rattle and Roll: Unwanted Energy – Vibration," Ergonomics In Design, Spring, Vol. 13, No. 2, pp. 4, 27-28, 2005 (Brian Peacock, Geoffrey Chase, Robert Fox, Richard Parker).
ANSI B11.TR1-2004 – ANSI Technical Report for Machine Tools – Ergonomics Guidelines for Design, Installation and Use, registered by ANSI May 16, 2004, participated on B11 Subcommittee on Ergonomics in developing report, listed as co-author.
"Ergonomics Force Exertion Screening Tool," paper published in the 7th Annual Applied Ergonomics Conference Proceedings, March, 2004 (C. Liss, P. O'Brien, R. Fox).
"Emerging Occupational Health and Safety Issues," Actionline – The Magazine of the Automotive Industry Action Group, pp. 15-17, February/March 2004 (Michael. Taubitz, Robert Fox, Dan. Reid).
"ISO Ergonomics Standards," ActionLine – The Magazine of the Automotive Industry Action Group, Vol. 22, Issue 6, pp. 26-28, July, 2002.
"Chapter 7: Ergonomics Analysis of Sheet-Metal Handling," book chapter in Digital Human Modeling for Vehicle and Workplace Design, Don B. Chaffin (ed.), Warrendale, PA:SAE Publications, 2001 (Brian Peacock, Heather Reed, Robert Fox).
"Self-paced High Frequency Lifting of Light Loads," paper presented at the IEA 2000/HFES 2000 Annual Meeting of the Human Factors and Ergonomics Society, July 30 – August 4, 2000, Diego, CA. (James L. Smith, Robert R. Fox).
"Pre-Columbian Contacts in the New World: Framing the Context," in Newark Holy Stones: Context for Controversy, symposium proceedings in preparation, symposium held November 6, 1999, Johnson-Humrickhouse Museum, Coshocton, OH. (Robert R. Fox)
"The Ergonomics of Computer Drafting Workstations," paper presented at the Houston Ergonomics Conference, Houston, TX., March 11, 1999 (Bob Fox, Brian Peacock).
"A Case Study: Thumb and Index Finger Push Forces Common to Assembly Processes," Advances in Occupational Ergonomics and Safety: Proceedings of the XIIIth Annual International Occupational Ergonomics and Safety Conference 1998, S. Kumar (ed.). IOS Press, pp. 390-393, 1998 (Ursula Wright, Juliann Leonard, Diane Neigebauer, Robert Fox, Brian Peacock).
"The Ergonomics of Small Lot Materials Delivery," paper presented at the Konz/Purswell Occupational Ergonomics Symposium, Institute for Ergonomics Research, Department of Industrial Engineering, Texas Tech University, Lubbock, TX, April 8, 1995 (Bob Fox, Brian Peacock).
"Socio-Technical Aspects of the Command and Control of Nuclear Weapons", 4th International Symposium on Human Factors in Organizational Design and Management (ODAM), Stockholm, Sweden, May 29 – June 4, 1994 (Robert R. Fox).
"Ergonomic Evaluation of Mail Satchels", paper presented at the Annual International Industrial Ergonomics and Safety Conference '94, San Antonio, TX, June 8 – 10, 1994 (T. M. Bernard, P. G. Dempsey, M. T. Fogleman, R.R. Fox, M. S. Hsiang, S. Noland).
"A Human Factors Evaluation of a Petroleum Production Plant Control Room," paper presented at the M. M. Ayoub Ergonomics Symposium, Institute for Ergonomics Research, Department of Industrial Engineering, Texas Tech University, Lubbock, TX, April 16 – 17, 1993 (R. Fox, M. Danz-Reese, J. L. Smith, K. Muise).
"Total Quality Training and Practice," paper presented at the 1992 Pacific Conference on Manufacturing, Osaka, Japan, November 3 – 6, 1992 (W. J. Kolarik and R. R. Fox). Material also contributed to Kolarik, W. J., Quality: Systems, Concepts, Strategies and Tools, New York: McGraw-Hill, published April 1995.
"Multiple Person Lift and Carry Task: A Time Study," 1991, Report from the Institute for Ergonomics Research, Texas Tech University, Subcontract #R1-67576X, (M. M. Ayoub, J. L. Smith, M. T. Fogleman, R. R. Fox).
"Air Force Maintenance Task Times," 1991, Final Report from the Institute for Ergonomics Research, Texas Tech University, Contract # R1-67576X, (M. M. Ayoub, J. L. Smith, R. R. Fox).
"Native Americans Contribute to Nation, World," 1989, article in TACOM Report, Vol. 15, No. 11, in honor of Native American Day, September 13, U.S. Army TACOM, Warren, MI (Bob Fox, author; Jim Coles, editor).
"Industrial Engineering Methods Training Program ('B – Engine Version')," 1986, General Motors Chevrolet-Pontiac-Canada Group Headquarters, Industrial Engineering Department, Warren, MI, (R. B. Harmon, R. Fox, S. Richards).
"Designing the Office Workplace: An Ergonomics Guide for Secretarial, Word Processing and VDT Workers," 1985, booklet published internally in General Motors, Chevrolet-Pontiac-Canada Group Headquarters, Industrial Engineering Department, Warren, MI, (Bob Fox).
"Illumination and Color in the Work Environment," 1983, manual published internally in General Motors, Fisher Body Central Offices, Industrial Engineering Activity, Warren, MI, (Robert Fox).


text:
/* String Column Sizes Information
 * (From: https://github.com/TryGhost/Ghost/pull/7932)
 *
 * Small strings = length 50
 * Medium strings = length 191
 * Large strings = length 1000-2000
 * Text = length 65535 (64 KiB)
 * Long text = length 1,000,000,000
 */
module.exports = {
    posts: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        uuid: {type: 'string', maxlength: 36, nullable: false, validations: {isUUID: true}},
        title: {type: 'string', maxlength: 2000, nullable: false, validations: {isLength: {max: 255}}},
        slug: {type: 'string', maxlength: 191, nullable: false},
        mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        comment_id: {type: 'string', maxlength: 50, nullable: true},
        plaintext: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        feature_image: {type: 'string', maxlength: 2000, nullable: true},
        featured: {type: 'bool', nullable: false, defaultTo: false},
        type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'post', validations: {isIn: [['post', 'page']]}},
        status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft'},
        // NOTE: unused at the moment and reserved for future features
        locale: {type: 'string', maxlength: 6, nullable: true},
        visibility: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'public'
        },
        email_recipient_filter: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'none'
        },
        /**
         * @deprecated: single authors was superceded by multiple authors in Ghost 1.22.0
         * If we keep it, then only, because you can easier query post.author_id than posts_authors[*].sort_order.
         */
        author_id: {type: 'string', maxlength: 24, nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        /**
         * @deprecated: https://github.com/TryGhost/Ghost/issues/10286
         *
         * This is valid for all x_by fields.
         */
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true},
        published_at: {type: 'dateTime', nullable: true},
        published_by: {type: 'string', maxlength: 24, nullable: true},
        custom_excerpt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}},
        codeinjection_head: {type: 'text', maxlength: 65535, nullable: true},
        codeinjection_foot: {type: 'text', maxlength: 65535, nullable: true},
        custom_template: {type: 'string', maxlength: 100, nullable: true},
        canonical_url: {type: 'text', maxlength: 2000, nullable: true},
        '@@UNIQUE_CONSTRAINTS@@': [
            ['slug', 'type']
        ]
    },
    posts_meta: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id', unique: true},
        og_image: {type: 'string', maxlength: 2000, nullable: true},
        og_title: {type: 'string', maxlength: 300, nullable: true},
        og_description: {type: 'string', maxlength: 500, nullable: true},
        twitter_image: {type: 'string', maxlength: 2000, nullable: true},
        twitter_title: {type: 'string', maxlength: 300, nullable: true},
        twitter_description: {type: 'string', maxlength: 500, nullable: true},
        meta_title: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}},
        meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}},
        email_subject: {type: 'string', maxlength: 300, nullable: true},
        frontmatter: {type: 'text', maxlength: 65535, nullable: true},
        feature_image_alt: {type: 'string', maxlength: 191, nullable: true, validations: {isLength: {max: 125}}},
        feature_image_caption: {type: 'text', maxlength: 65535, nullable: true},
        email_only: {type: 'bool', nullable: false, defaultTo: false}
    },
    users: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        password: {type: 'string', maxlength: 60, nullable: false},
        email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
        profile_image: {type: 'string', maxlength: 2000, nullable: true},
        cover_image: {type: 'string', maxlength: 2000, nullable: true},
        bio: {type: 'text', maxlength: 65535, nullable: true, validations: {isLength: {max: 200}}},
        website: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}},
        location: {type: 'text', maxlength: 65535, nullable: true, validations: {isLength: {max: 150}}},
        facebook: {type: 'string', maxlength: 2000, nullable: true},
        twitter: {type: 'string', maxlength: 2000, nullable: true},
        accessibility: {type: 'text', maxlength: 65535, nullable: true},
        // TODO: would be good to add validation here to control for all possible status values.
        //       The ones that come up by reviewing the user model are:
        //       'active', 'inactive', 'locked', 'warn-1', 'warn-2', 'warn-3', 'warn-4'
        status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'active'},
        // NOTE: unused at the moment and reserved for future features
        locale: {type: 'string', maxlength: 6, nullable: true},
        visibility: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'public',
            validations: {isIn: [['public']]}
        },
        meta_title: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}},
        meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}},
        tour: {type: 'text', maxlength: 65535, nullable: true},
        last_seen: {type: 'dateTime', nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    oauth: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        provider: {type: 'string', maxlength: 50, nullable: false},
        provider_id: {type: 'string', maxlength: 191, nullable: false},
        access_token: {type: 'text', maxlength: 65535, nullable: true},
        refresh_token: {type: 'text', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'}
    },
    posts_authors: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'},
        author_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'},
        sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
    },
    roles: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 50, nullable: false, unique: true},
        description: {type: 'string', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    roles_users: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        role_id: {type: 'string', maxlength: 24, nullable: false},
        user_id: {type: 'string', maxlength: 24, nullable: false}
    },
    permissions: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 50, nullable: false, unique: true},
        object_type: {type: 'string', maxlength: 50, nullable: false},
        action_type: {type: 'string', maxlength: 50, nullable: false},
        object_id: {type: 'string', maxlength: 24, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    permissions_users: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        user_id: {type: 'string', maxlength: 24, nullable: false},
        permission_id: {type: 'string', maxlength: 24, nullable: false}
    },
    permissions_roles: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        role_id: {type: 'string', maxlength: 24, nullable: false},
        permission_id: {type: 'string', maxlength: 24, nullable: false}
    },
    settings: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        group: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'core',
            validations: {
                isIn: [[
                    'amp',
                    'core',
                    'email',
                    'labs',
                    'members',
                    'portal',
                    'private',
                    'site',
                    'slack',
                    'theme',
                    'unsplash',
                    'views'
                ]]
            }
        },
        key: {type: 'string', maxlength: 50, nullable: false, unique: true},
        // NOTE: as JSON objects are no longer stored in `value` we could potentially reduce the maxlength
        value: {type: 'text', maxlength: 65535, nullable: true},
        type: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            validations: {
                isIn: [[
                    'array',
                    'string',
                    'number',
                    'boolean',
                    'object'
                ]]
            }
        },
        flags: {type: 'string', maxlength: 50, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    tags: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false, validations: {matches: /^([^,]|$)/}},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        description: {type: 'text', maxlength: 65535, nullable: true, validations: {isLength: {max: 500}}},
        feature_image: {type: 'string', maxlength: 2000, nullable: true},
        parent_id: {type: 'string', nullable: true},
        visibility: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'public',
            validations: {isIn: [['public', 'internal']]}
        },
        og_image: {type: 'string', maxlength: 2000, nullable: true},
        og_title: {type: 'string', maxlength: 300, nullable: true},
        og_description: {type: 'string', maxlength: 500, nullable: true},
        twitter_image: {type: 'string', maxlength: 2000, nullable: true},
        twitter_title: {type: 'string', maxlength: 300, nullable: true},
        twitter_description: {type: 'string', maxlength: 500, nullable: true},
        meta_title: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}},
        meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}},
        codeinjection_head: {type: 'text', maxlength: 65535, nullable: true},
        codeinjection_foot: {type: 'text', maxlength: 65535, nullable: true},
        canonical_url: {type: 'string', maxlength: 2000, nullable: true},
        accent_color: {type: 'string', maxlength: 50, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    posts_tags: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'},
        tag_id: {type: 'string', maxlength: 24, nullable: false, references: 'tags.id'},
        sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
    },
    invites: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        role_id: {type: 'string', maxlength: 24, nullable: false},
        status: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'pending',
            validations: {isIn: [['pending', 'sent']]}
        },
        token: {type: 'string', maxlength: 191, nullable: false, unique: true},
        email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
        expires: {type: 'bigInteger', nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    brute: {
        key: {type: 'string', maxlength: 191, primary: true},
        firstRequest: {type: 'bigInteger'},
        lastRequest: {type: 'bigInteger'},
        lifetime: {type: 'bigInteger'},
        count: {type: 'integer'}
    },
    sessions: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        session_id: {type: 'string', maxlength: 32, nullable: false, unique: true},
        user_id: {type: 'string', maxlength: 24, nullable: false},
        session_data: {type: 'string', maxlength: 2000, nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    integrations: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        type: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'custom',
            validations: {isIn: [['internal', 'builtin', 'custom']]}
        },
        name: {type: 'string', maxlength: 191, nullable: false},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        icon_image: {type: 'string', maxlength: 2000, nullable: true},
        description: {type: 'string', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    webhooks: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        event: {type: 'string', maxlength: 50, nullable: false, validations: {isLowercase: true}},
        target_url: {type: 'string', maxlength: 2000, nullable: false},
        name: {type: 'string', maxlength: 191, nullable: true},
        secret: {type: 'string', maxlength: 191, nullable: true},
        // NOTE: the defaultTo does not make sense to set on DB layer as it leads to unnecessary maintenance every major release
        //       it might make sense to introduce "isIn" validation checking if it's a valid version e.g: 'v3', 'v4', 'canary'
        api_version: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'v2'},
        // NOTE: integration_id column needs "nullable: true" -> "nullable: false" migration (recreate table with nullable: false)
        // CASE: Ghost instances initialized pre 4.0 will have this column set to nullable: true in db schema
        integration_id: {type: 'string', maxlength: 24, nullable: false, references: 'integrations.id', cascadeDelete: true},
        status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'available'},
        last_triggered_at: {type: 'dateTime', nullable: true},
        last_triggered_status: {type: 'string', maxlength: 50, nullable: true},
        last_triggered_error: {type: 'string', maxlength: 50, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    api_keys: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        type: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            validations: {isIn: [['content', 'admin']]}
        },
        secret: {
            type: 'string',
            maxlength: 191,
            nullable: false,
            unique: true,
            validations: {isLength: {min: 26, max: 128}}
        },
        role_id: {type: 'string', maxlength: 24, nullable: true},
        // integration_id is nullable to allow "internal" API keys that don't show in the UI
        integration_id: {type: 'string', maxlength: 24, nullable: true},
        user_id: {type: 'string', maxlength: 24, nullable: true},
        last_seen_at: {type: 'dateTime', nullable: true},
        last_seen_version: {type: 'string', maxlength: 50, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    mobiledoc_revisions: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        post_id: {type: 'string', maxlength: 24, nullable: false, index: true},
        mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        created_at_ts: {type: 'bigInteger', nullable: false},
        created_at: {type: 'dateTime', nullable: false}
    },
    members: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        uuid: {type: 'string', maxlength: 36, nullable: true, unique: true, validations: {isUUID: true}},
        email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
        status: {
            type: 'string', maxlength: 50, nullable: false, defaultTo: 'free', validations: {
                isIn: [['free', 'paid', 'comped']]
            }
        },
        name: {type: 'string', maxlength: 191, nullable: true},
        note: {type: 'string', maxlength: 2000, nullable: true},
        geolocation: {type: 'string', maxlength: 2000, nullable: true},
        subscribed: {type: 'bool', nullable: true, defaultTo: true},
        email_count: {type: 'integer', unsigned: true, nullable: false, defaultTo: 0},
        email_opened_count: {type: 'integer', unsigned: true, nullable: false, defaultTo: 0},
        email_open_rate: {type: 'integer', unsigned: true, nullable: true, index: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    products: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        monthly_price_id: {type: 'string', maxlength: 24, nullable: true},
        yearly_price_id: {type: 'string', maxlength: 24, nullable: true},
        description: {type: 'string', maxlength: 191, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    offers: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        active: {type: 'boolean', nullable: false, defaultTo: true},
        name: {type: 'string', maxlength: 191, nullable: false, unique: true},
        code: {type: 'string', maxlength: 191, nullable: false, unique: true},
        product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id'},
        stripe_coupon_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
        interval: {type: 'string', maxlength: 50, nullable: false, validations: {isIn: [['month', 'year']]}},
        currency: {type: 'string', maxlength: 50, nullable: true},
        discount_type: {type: 'string', maxlength: 50, nullable: false, validations: {isIn: [['percent', 'amount']]}},
        discount_amount: {type: 'integer', nullable: false},
        duration: {type: 'string', maxlength: 50, nullable: false},
        duration_in_months: {type: 'integer', nullable: true},
        portal_title: {type: 'string', maxlength: 191, nullable: false},
        portal_description: {type: 'string', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    benefits: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    products_benefits: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id', cascadeDelete: true},
        benefit_id: {type: 'string', maxlength: 24, nullable: false, references: 'benefits.id', cascadeDelete: true},
        sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
    },
    members_products: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id', cascadeDelete: true},
        sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
    },
    members_payment_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        amount: {type: 'integer', nullable: false},
        currency: {type: 'string', maxLength: 3, nullable: false},
        source: {type: 'string', maxlength: 50, nullable: false},
        created_at: {type: 'dateTime', nullable: false}
    },
    members_login_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        created_at: {type: 'dateTime', nullable: false}
    },
    members_email_change_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        to_email: {type: 'string', maxlength: 191, nullable: false, unique: false, validations: {isEmail: true}},
        from_email: {type: 'string', maxlength: 191, nullable: false, unique: false, validations: {isEmail: true}},
        created_at: {type: 'dateTime', nullable: false}
    },
    members_status_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        from_status: {
            type: 'string', maxlength: 50, nullable: true, validations: {
                isIn: [['free', 'paid', 'comped']]
            }
        },
        to_status: {
            type: 'string', maxlength: 50, nullable: true, validations: {
                isIn: [['free', 'paid', 'comped']]
            }
        },
        created_at: {type: 'dateTime', nullable: false}
    },
    members_product_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        product_id: {type: 'string', maxlength: 24, nullable: false, references: 'products.id', cascadeDelete: false},
        action: {
            type: 'string', maxlength: 50, nullable: true, validations: {
                isIn: [['added', 'removed']]
            }
        },
        created_at: {type: 'dateTime', nullable: false}
    },
    members_paid_subscription_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        from_plan: {type: 'string', maxlength: 255, nullable: true},
        to_plan: {type: 'string', maxlength: 255, nullable: true},
        currency: {type: 'string', maxLength: 3, nullable: false},
        source: {
            type: 'string', maxlength: 50, nullable: false, validations: {
                isIn: [['stripe']]
            }
        },
        mrr_delta: {type: 'integer', nullable: false},
        created_at: {type: 'dateTime', nullable: false}
    },
    labels: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false, unique: true},
        slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    members_labels: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
        label_id: {type: 'string', maxlength: 24, nullable: false, references: 'labels.id', cascadeDelete: true},
        sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
    },
    members_stripe_customers: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, unique: false, references: 'members.id', cascadeDelete: true},
        customer_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
        name: {type: 'string', maxlength: 191, nullable: true},
        email: {type: 'string', maxlength: 191, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    members_stripe_customers_subscriptions: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        customer_id: {type: 'string', maxlength: 255, nullable: false, unique: false, references: 'members_stripe_customers.customer_id', cascadeDelete: true},
        subscription_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
        stripe_price_id: {type: 'string', maxlength: 255, nullable: false, unique: false, index: true, defaultTo: ''},
        status: {type: 'string', maxlength: 50, nullable: false},
        cancel_at_period_end: {type: 'bool', nullable: false, defaultTo: false},
        cancellation_reason: {type: 'string', maxlength: 500, nullable: true},
        current_period_end: {type: 'dateTime', nullable: false},
        start_date: {type: 'dateTime', nullable: false},
        default_payment_card_last4: {type: 'string', maxlength: 4, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true},
        /* Below fields are now redundant as we link prie_id to stripe_prices table */
        plan_id: {type: 'string', maxlength: 255, nullable: false, unique: false},
        plan_nickname: {type: 'string', maxlength: 50, nullable: false},
        plan_interval: {type: 'string', maxlength: 50, nullable: false},
        plan_amount: {type: 'integer', nullable: false},
        plan_currency: {type: 'string', maxLength: 3, nullable: false}
    },
    members_subscribe_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        member_id: {type: 'string', maxlength: 24, nullable: false, unique: false, references: 'members.id', cascadeDelete: true},
        subscribed: {type: 'bool', nullable: false, defaultTo: true},
        created_at: {type: 'dateTime', nullable: false},
        source: {type: 'string', maxlength: 50, nullable: true}
    },
    stripe_products: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        product_id: {type: 'string', maxlength: 24, nullable: false, unique: false, references: 'products.id'},
        stripe_product_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    stripe_prices: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        stripe_price_id: {type: 'string', maxlength: 255, nullable: false, unique: true},
        stripe_product_id: {type: 'string', maxlength: 255, nullable: false, unique: false, references: 'stripe_products.stripe_product_id'},
        active: {type: 'bool', nullable: false},
        nickname: {type: 'string', maxlength: 50, nullable: true},
        currency: {type: 'string', maxLength: 3, nullable: false},
        amount: {type: 'integer', nullable: false},
        type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'recurring', validations: {isIn: [['recurring', 'one_time']]}},
        interval: {type: 'string', maxlength: 50, nullable: true},
        description: {type: 'string', maxlength: 191, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: true}
    },
    actions: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        resource_id: {type: 'string', maxlength: 24, nullable: true},
        resource_type: {type: 'string', maxlength: 50, nullable: false},
        actor_id: {type: 'string', maxlength: 24, nullable: false},
        actor_type: {type: 'string', maxlength: 50, nullable: false},
        // @NOTE: The event column contains short buzzwords e.g. subscribed, started, added, deleted, edited etc.
        //        We already store and require the target resource type. No need to remember e.g. post.edited
        event: {type: 'string', maxlength: 50, nullable: false},
        // @NOTE: The context object can be used to store information about an action e.g. diffs, meta
        context: {type: 'text', maxlength: 1000000000, nullable: true},
        created_at: {type: 'dateTime', nullable: false}
    },
    emails: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        post_id: {type: 'string', maxlength: 24, nullable: false, index: true, unique: true},
        uuid: {type: 'string', maxlength: 36, nullable: false, validations: {isUUID: true}},
        status: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'pending',
            validations: {isIn: [['pending', 'submitting', 'submitted', 'failed']]}
        },
        recipient_filter: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'status:-free'
        },
        error: {type: 'string', maxlength: 2000, nullable: true},
        error_data: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        email_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0},
        delivered_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0},
        opened_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0},
        failed_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0},
        subject: {type: 'string', maxlength: 300, nullable: true},
        from: {type: 'string', maxlength: 2000, nullable: true},
        reply_to: {type: 'string', maxlength: 2000, nullable: true},
        html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        plaintext: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
        track_opens: {type: 'bool', nullable: false, defaultTo: false},
        submitted_at: {type: 'dateTime', nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    email_batches: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        email_id: {type: 'string', maxlength: 24, nullable: false, references: 'emails.id'},
        provider_id: {type: 'string', maxlength: 255, nullable: true},
        status: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            defaultTo: 'pending',
            validations: {isIn: [['pending', 'submitting', 'submitted', 'failed']]}
        },
        member_segment: {type: 'text', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        updated_at: {type: 'dateTime', nullable: false}
    },
    email_recipients: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        email_id: {type: 'string', maxlength: 24, nullable: false, references: 'emails.id'},
        member_id: {type: 'string', maxlength: 24, nullable: false, index: true},
        batch_id: {type: 'string', maxlength: 24, nullable: false, references: 'email_batches.id'},
        processed_at: {type: 'dateTime', nullable: true},
        delivered_at: {type: 'dateTime', nullable: true, index: true},
        opened_at: {type: 'dateTime', nullable: true, index: true},
        failed_at: {type: 'dateTime', nullable: true, index: true},
        member_uuid: {type: 'string', maxlength: 36, nullable: false},
        member_email: {type: 'string', maxlength: 191, nullable: false},
        member_name: {type: 'string', maxlength: 191, nullable: true},
        '@@INDEXES@@': [
            ['email_id', 'member_email']
        ]
    },
    tokens: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        token: {type: 'string', maxlength: 32, nullable: false, index: true},
        data: {type: 'string', maxlength: 2000, nullable: true},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false}
    },
    snippets: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        name: {type: 'string', maxlength: 191, nullable: false, unique: true},
        mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        created_by: {type: 'string', maxlength: 24, nullable: false},
        updated_at: {type: 'dateTime', nullable: true},
        updated_by: {type: 'string', maxlength: 24, nullable: true}
    },
    temp_member_analytic_events: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        event_name: {type: 'string', maxlength: 50, nullable: false},
        created_at: {type: 'dateTime', nullable: false},
        member_id: {type: 'string', maxlength: 24, nullable: false},
        member_status: {type: 'string', maxlength: 50, nullable: false},
        entry_id: {type: 'string', maxlength: 24, nullable: true},
        source_url: {type: 'string', maxlength: 2000, nullable: true},
        metadata: {type: 'string', maxlength: 191, nullable: true}
    },
    custom_theme_settings: {
        id: {type: 'string', maxlength: 24, nullable: false, primary: true},
        theme: {type: 'string', maxlength: 191, nullable: false},
        key: {type: 'string', maxlength: 191, nullable: false},
        type: {
            type: 'string',
            maxlength: 50,
            nullable: false,
            validations: {
                isIn: [[
                    'select'
                ]]
            }
        },
        value: {type: 'text', maxlength: 65535, nullable: true}
    }
};

redpajama_set_name: RedPajamaGithub


text:
Aces Sweep Rainiers in Three-Game Slate
In their final regular season series, the Reno Aces collided with the Tacoma Rainiers in a three-game homestand and earned all three wins. The Aces finished the regular season with a franchise-best 85-63 record. A combined five-RBI night from Jancarlos Cintron and Alek Thomas led the Aces in a 7-2
In their final regular season series, the Reno Aces collided with the Tacoma Rainiers in a three-game homestand and earned all three wins. The Aces finished the regular season with a franchise-best 85-63 record.
A combined five-RBI night from Jancarlos Cintron and Alek Thomas led the Aces in a 7-2 win over the Rainiers Monday night. The Aces struck first with a three-run fourth inning capped off by a two-run single from Cintron to give Reno a 3-0 advantage. The infielder finished the night with a 3-for-5 effort, including a double and three RBI. Thomas added some insurance for the Aces in the sixth with an RBI single up the middle for a 4-1 lead. The Chicago, Illinois native recorded a two-hit night with a double, two RBI and a run scored Monday night. The win was awarded to Blake Workman (W, 4-0) after the right-hander tossed 2.0 innings of one-run ball on one hit, one walk and three strikeouts.
On Tuesday night, Leandro Cedeno's impressive homer and three-RBI performance kickstarted Reno's offense in a 7-2 win over Tacoma. Cedeno remained hot at the plate with a three-hit night (3-for-4, HR, 3 RBI, 1 R), including a mammoth 456-foot two-run shot past the batter's eye in the fourth inning. The designated hitter added another run in the fifth frame with an RBI single to left, giving the Aces a 5-0 advantage. In the sixth inning, Drew Stankiewicz put a stamp on Reno's 7-2 win with a two-run triple to right-center. Deyni Olivero (2-1) toed the slab for Reno and recorded his second Triple-A win of the season with five scoreless innings as the 24-year-old allowed five hits, three walks and fanned three batters.
Thomas continued his hot-hitting Wednesday afternoon with a perfect 5-for-5 day in Reno's 11-1 rout of Tacoma. Throughout the nine innings, Thomas drove in three runs, scored three times and swiped two bases. Leading 4-0 in the seventh, Reno's bats recorded a seven-run inning highlighted by a two-run single from the Chicago, Illinois native to seal the Aces' 11-1 win. The win was awarded to Justin Martinez after the right-hander tossed a scoreless fifth, allowed one hit, walked two and fanned three batters.
Alek Thomas: Hit .643 (9-for-14) in three games with five RBI, six runs scored and two stolen bases against Tacoma.
Jancarlos Cintron: Played in two games against the Rainiers and batted .500 (5-for-10) with four RBI. The infielder is hitting .337 (28-for-83) with 11 RBI in 18 games.
Dominic Fletcher: Started all three games and hit .400 (4-for-10) with four RBI and three runs scored. The Arkansas product finished the 2022 regular season in Reno with five homers, 38 RBI and a team-leading 29 doubles in 101 games.
Deyni Olivero: (W, 2-1) 5.0 IP, 5 H, 0 ER, 3 BB, 3 K's in 09/27 start.
Blake Workman: (W, 4-0) 3.0 IP, 2 H, 1 ER, 2 BB, 2K's in two relief appearances.

redpajama_set_name: RedPajamaCommonCrawl


It's not traditional for the bride to give a speech at a royal wedding, but Meghan Markle is turning all the crumpet baskets on their heads.
The Sunday Times reports that Markle will be breaking from tradition and giving a toast at her wedding to Prince Harry. Generally, this is an honor reserved for the groom, the father of the bride, and the best man. They kind of survey all the men in the area to see if they have something to say about what's happening, but the bride stays out of it.
Those are the freebies, contact me directly for more, Meghan.
This Royal Wedding Cake Made of Cheese: Yes or No?


text:
Editorial and Scientific Board
Previous issues (old web)
Journal supporters
The Influence of COVID-19 on Particulate Matter Concentrations in a Medium-Sized Town
David Jesenko University of Maribor, Faculty of Electrical Engineering and Computer Science
Domen Mongus University of Maribor, Faculty of Electrical Engineering and Computer Science
Uroš Lešnik National Laboratory of Health, Environment and Food, Maribor
https://doi.org/10.7307/ptt.v34i5.4121
PM10, PM2.5, COVID-19, traffic, particulate matter
The pandemic caused by the coronavirus COVID-19 is having a worldwide impact that affects health, economy and air pollution in cities indirectly. In Slovenia, as well as in all other countries, the number of cases of infected people increased continually in 2020, which affected the health system and caused movement restrictions, which, in turn, affected the air pollution in the country. This article presents the indirect effect produced by this pandemic on air pollution in Maribor, Slovenia. Traffic and air quality data were used to perform the evaluation, in particular PM10 and PM2.5 daily concentrations from the monitoring station in Maribor. By observing the detailed traffic data and particulate matter concentrations acquired in the Maribor city centre before and during the pandemic times, we show the influence of COVID-19 on particulate matter concentrations in that part of the town. The results show slightly lower particulate matter concentrations, which could be explained by the significantly lower traffic volume values in the lockdown months.
WHO. WHO global urban ambient air pollution database. World Health Organization; 2016.
Loomis D, et al. The carcinogenicity of outdoor air pollution. Lancet Oncology. 2013;14(13): 1262-1263. doi: 10.1016/s1470-2045(13)70487-x.
Marco G, Bo X. Air quality legislation and standards in the European union: Background, status and public participation. Advances in Climate Change Research. 2013;4(1): 50-59. doi: 10.3724/SP.J.1248.2013.050.
WHO. Air quality guidelines: Global update 2005. Particulate matter, ozone, nitrogen dioxide and sulfur dioxide. World Health Organization; 2006.
Guerreiro CBB, Foltescu V, De Leeuw F. Air quality status and trends in Europe. Atmospheric Environment. 2014;98(1): 376-384. doi: 10.1016/j.atmosenv.2014.09.017.
Cui J, Li F, Shi ZL. Origin and evolution of pathogenic coronaviruses. Nature Reviews Microbiology. 2019;17(3): 181-192. https://www.nature.com/articles/s41579-018-0118-9.
Hu B, Guo H, Zhou P, Shi ZL. Characteristics of SARS-CoV-2 and COVID-19. Nature Reviews Microbiology. 2021;19(3): 141-154. https://www.nature.com/articles/s41579-020-00459-7.
Wu JT, Leung K, Leung GM. Nowcasting and forecasting the potential domestic and international spread of the 2019-nCoV outbreak originating in Wuhan, China: A modelling study. The Lancet. 2020;395(10225): 689-697. doi: 10.1016/S0140-6736(20)30260-9.
Hui DS, et al. The continuing 2019-nCoV epidemic threat of novel coronaviruses to global health - The latest 2019 novel coronavirus outbreak in Wuhan, China. International Journal of Infectious Diseases. 2020;91(1): 264-266. doi: 10.1016/j.ijid.2020.01.009.
Vodičar PM, et al. Low prevalence of active COVID-19 in Slovenia: A nationwide population study of a probability-based sample. Clinical Microbiology and Infection. 2020;26(11): 1514-1519. doi: 10.1016/j.cmi.2020.07.013.
WHO. Coronavirus disease 2019 (COVID-19): Situation report. World Health Organization, 2020.
Fajersztajn L, Veras M, Barrozo LV, Saldiva P. Air pollution: A potentially modifiable risk factor for lung cancer. Nature Reviews Cancer. 2013;13(9): 674-678. https://www.nature.com/articles/nrc3572.
Jesenko D, et al. Visualization and analytics tool for multi-dimensional data. Proceedings of the 2018 International Conference on Big Data and Education. 2018;1(1): 1-5.
Lešnik U, Mongus D, Jesenko D. Predictive analytics of PM10 concentration levels using detailed traffic data. Transportation Research Part D: Transport and Environment. 2018;67(1): 131-141. doi: 10.1016/j.trd.2018.11.015.
Shakil MH, Munim ZH, Tasnia M, Sarowar S. COVID-19 and the environment: A critical review and research agenda. Science of the Total Environment. 2020;745(1): 141022. doi: 10.1016/j.scitotenv.2020.141022.
Wang Q, Su M. A preliminary assessment of the impact of COVID-19 on environment - A case study of China. Science of the Total Environment. 2020;728(1): 138915. doi: 10.1016/j.scitotenv.2020.138915.
Zambrano-Monserrate MA, Ruano MA, Sanchez-Alcalde L. Indirect effects of COVID-19 on the environment. Science of the Total Environment. 2020;728(1): 138813. doi: 10.1016/j.scitotenv.2020.138813.
Saadat S, Rawtani D, Hussain CM. Environmental perspective of COVID-19. Science of the Total Environment. 2020;728(1): 138870. doi: 10.1016/j.scitotenv.2020.138870.
Bashir MF, et al. Correlation between climate indicators and COVID-19 pandemic in New York, USA. Science of the Total Environment. 2020;728(1): 138835. doi: 10.1016/j.scitotenv.2020.138835.
Tosepu R, et al. Correlation between weather and Covid-19 pandemic in Jakarta, Indonesia. Science of the Total Environment. 2020;725(1): 138436. doi: 10.1016/j.scitotenv.2020.138436.
Sahin M. Impact of weather on COVID-19 pandemic in Turkey. Science of the Total Environment. 2020;728(1): 138810. doi: 10.1016/j.scitotenv.2020.138810.
Qi H, et al. COVID-19 transmission in Mainland China is associated with temperature and humidity: A time-series analysis. Science of the Total Environment. 2020;728(1): 138778. doi: 10.1016/j.scitotenv.2020.138778.
Gupta S, Raghuwanshi GS, Chanda A. Effect of weather on COVID-19 spread in the US: A prediction model for India in 2020. Science of the Total Environment. 2020;728(1): 138860. doi: 10.1016/j.scitotenv.2020.138860.
Sobral MFF, et al. Association between climate variables and global transmission of SARS-CoV-2. Science of the Total Environment. 2020;729(1): 138997. doi: 10.1016/j.scitotenv.2020.138997.
Abdullah S, et al. Air quality status during 2020 Malaysia Movement Control Order (MCO) due to 2019 novel coronavirus (2019-nCoV) pandemic. Science of the Total Environment. 2020;729(1): 139022. doi: 10.1016/j.scitotenv.2020.139022.
Dantas G, et al. The impact of COVID-19 partial lockdown on the air quality of the city of Rio de Janeiro, Brazil. Science of the Total Environment. 2020;729(1): 139085. doi: 10.1016/j.scitotenv.2020.139085.
Tobias A, et al. Changes in air quality during the lockdown in Barcelona (Spain) one month into the SARS-CoV-2 epidemic. Science of the Total Environment. 2020;726(1): 138540. doi: 10.1016/j.scitotenv.2020.138540.
Muhammad S, Long X, Salman M. COVID-19 pandemic and environmental pollution: A blessing in disguise? Science of the Total Environment. 2020;728(1): 138820. doi: 10.1016/j.scitotenv.2020.138820.
Xu K, et al. Impact of the COVID-19 event on air quality in Central China. Aerosol and Air Quality Research. 2020;20(5): 915-929. doi: 10.4209/aaqr.2020.04.0150.
Jain S, Sharma T. Social and travel lockdown impact considering coronavirus disease (COVID-19) on air quality in megacities of India: Present benefits, future challenges, and way forward. Aerosol and Air Quality Research. 2020;20(6): 1222-1236. doi: 10.4209/aaqr.2020.04.0171.
Bacak TN, Toros H. Impact of the COVID-19 event on PM10 air pollution in Istanbul and Ankara. Journal of Research in Atmospheric Science. 2021;3(1): 1-7.
Zareba M, Danek T. Analysis of air pollution migration during COVID-19 lockdown in Krakow, Poland. Aerosol and Air Quality Research. 2022;22(3): 1-22. doi: doi.org/10.4209/aaqr.210275.
Alharbi BH, Alhazmi HA, Aldhafeeri ZM. Air quality of work, residential, and traffic areas during the COVID-19 lockdown with insights to improve air quality. International Journal of Environmental Research and Public Health. 2022;19(2): 727-744. doi: 10.3390/ijerph19020727.
Shukla S, et al. Appraisal of COVID-19 lockdown and unlocking effects on the air quality of North India. Environmental Research. 2022;204(1): 112107. doi: 10.1016/j.envres.2021.112107.
Rojano R, Arregoces H, Frias EG. Changes in ambient particulate matter during the COVID-19 and associations with biomass burning and Sahara dust in northern Colombia. Heliyon. 2021;7(12): e08595. doi: 10.1016/j.heliyon.2021.e08595.
Tekin OF. Evaluation of air pollutants (PM10 and SO2) in the first year of the COVID-19: A city sample from Turkey. World Journal of Advanced Research and Reviews. 2021;10(1): 41-47. doi: 10.30574/wjarr.2021.10.1.0130.
Al-Hemoud A, et al. PM2.5 and PM10 during COVID-19 lockdown in Kuwait: Mixed effect of dust and meteorological covariates. Environmental Challenges. 2021;5(1): 100215. doi: 10.1016/j.envc.2021.100215.
Abdi H, Williams LJ. Principal component analysis. Wiley Interdisciplinary Reviews: Computational Statistics. 2010;2(4): 433-459. doi: 10.1002/wics.101.
Lukač N, Žalik B. Fast approximate k-nearest neighbours search using GPGPU. GPU Computing and Applications. 2015;2(1): 221-234. doi: 10.1007/978-981-287-134-3_14.
Papanastasiou DK, Melas D, Kioutsioukis I. Development and assessment of neural network and multiple regression models in order to predict PM10 levels in a medium-sized Mediterranean city. Water, Air, and Soil Pollution. 2007;182(1): 325-334. doi: 10.1007/s11270-007-9341-0.
Nagendra SM, Khare M. Artificial neural network based line source models for vehicular exhaust emission predictions of an urban roadway. Transportation Research Part D: Transport and Environment. 2004;9(3): 199-208. doi: 10.1016/j.trd.2004.01.002.
Cai M, Yin Y, Xie M. Prediction of hourly air pollutant concentrations near urban arterials using artificial neural network approach. Transportation Research Part D: Transport and Environment. 2009;14(1): 32-41. doi: 10.1016/j.trd.2008.10.004.
Hooyberghs J, et al. A neural network forecast for daily average PM10 concentrations in Belgium. Atmospheric Environment. 2005;39(18): 3279-3289. doi: 10.1016/j.atmosenv.2005.01.050.
Grivas G, Chaloulakou A. Artificial neural network models for prediction of PM10 hourly concentrations, in the Greater Area of Athens, Greece. Atmospheric Environment. 2006;40(7): 1216-1229. doi: 10.1016/j.atmosenv.2005.10.036.
Stadlober E, Hörmann S, Pfeiler B. Quality and performance of a PM10 daily forecasting model. Atmospheric Environment. 2008;42(6): 1098-1109. doi: 10.1016/j.atmosenv.2007.10.073.
Hörmann S, Pfeiler B, Stadlober E. Analysis and prediction of particulate matter PM10 for the winter season in Graz. Austrian Journal of Statistics. 2005;34(4): 307-326. https://graz.pure.elsevier.com/en/publications/analysis-and-prediction-of-particulate-matter-pm10-for-the-winter.
Barmpadimos I, et al. Influence of meteorology on PM 10 trends and variability in Switzerland from 1991 to 2008. Atmospheric Chemistry and Physics. 2011;11(4): 1813-1835. doi: 10.5194/acp-11-1813-2011.
Hoi KI, Yuen KV, Mok KM. Prediction of daily averaged PM10 concentrations by statistical time-varying model. Atmospheric Environment. 2009;43(16): 2579-2581. doi: 10.1016/j.atmosenv.2009.02.020.
Schnelle-Kreis J, et al. Impact of wood combustion on urban PM10 concentration. EGU General Assembly Conference Abstracts. 2009;1(1): 2965. https://meetingorganizer.copernicus.org/EGU2009/EGU2009-2965-1.pdf.
Scheinhardt S, et al. Comprehensive chemical characterisation of size-segregated PM10 in Dresden and estimation of changes due to global warming. Atmospheric Environment. 2013;75(1): 365-373. doi: 10.1016/j.atmosenv.2013.04.059.
Beddows DC, Harrison RM. PM10 and PM2.5 emission factors for non-exhaust particles from road vehicles: Dependence upon vehicle mass and implications for battery electric vehicles. Atmospheric Environment. 2021;244(1): 117886. doi: 10.1016/j.atmosenv.2020.117886.
Gvero P, Radić R, Kotur M, Kardaš D. Urban air pollution caused by the emission of PM10 from the small household devices and abatement measures. Thermal Science. 2018;22(6 Part A): 2325-2333. doi: 10.2298/TSCI180119152G.
Jesenko, D., Mongus, D., & Lešnik, U. (2022). The Influence of COVID-19 on Particulate Matter Concentrations in a Medium-Sized Town. Promet, 34(5), 813–823. https://doi.org/10.7307/ptt.v34i5.4121
Copyright (c) 2022 David Jesenko, Domen Mongus, Uroš Lešnik
Website version
This is the new journal website
Submissions & Author Guidelines
Impact factor for 2021: IF 0.909
The journal is indexed in:
WoS - SCIE (Clarivate Analytics)
weebsin
The secret of success of a scientific investigator is comprised in three words - work, finish, publish.
Michael Faraday (1791 - 1867)


text:
Sargeant X Comrade Are Leading the Herd
Meet the neo-soul experimentalists making old school fresh again with their improvisational attitude.
by Ben Boddez
Photo by Sebastian Buzzalino
In the fast moving musical landscape of today where old-school doesn't always retain the same freshness or cultural cache that it once did, Calgary-based duo Sargeant X Comrade are committed to blowing the dust off what came before them while bridging the gap between old and new.
Vocalist Yolanda Sargeant's contemporary and dynamic soulful stylings collide with producer Jay Bykovets' lifelong love of old-school hip-hop, but Sargeant X Comrade are pulling much more than old styles into a modern context on new album, The Elephant In The Room. Legendary figures like the late Gift of Gab of Blackalicious fame intermingle with rising talents on their features list, while familiar classics are repurposed with updated lyrics.
In the past, the duo has collaborated with other hip-hop stalwarts like Kool Keith and Planet Asia, paying homage to their personal heroes. "These days, the old school cats get forgotten pretty quickly, it's more of a throwaway culture," Bykovets says. "They're the ones who paved the way, and we think we need to show respect."
Combining familiar voices with local talent like Edmonton rapper K-Riz and Shampane Di Topbanga keep the duo's message of bridging cultural and generational gaps alive with an eclectic mix of soul, jazz, boom-bap, dancehall, and even a little opera — all adorned with a dusty vintage crackle. "It might be a sound that you've heard, but then we remix it in our own way," Sargeant says. "Duke Ellington says that one day there's going to be a time when there's no genre. If you start to think outside the box, you realize that everything is a box. But we just want to be free."
The outsider perspective to their craft might have something to do with their origin stories starting on opposite sides of the world; Sargeant has Caribbean heritage, while Bykovets was born in Russia. Over the phone, Bykovets is calm and precise as he explains his musical methods. Sargeant, on the other hand, often catches herself wondering whether she's revealing too much, interspersing her rapid-fire brainwaves with an infectious cackle and freestyle raps about Babar the Elephant. But when a topic excites them, they end up finishing each other's sentences.
Sargeant in particular values an all-inclusive musical mixture to celebrate and reclaim the nagging sensation of feeling like an outsider that has followed her throughout her musical journey. Part of a touring children's choir from an early age, she recalls being put down by peers after gaining the confidence to get up on stage. Her later interest in punk rock meant she often found herself receiving quizzical stares as the only person of colour in the room. "We try to stay positive and push a message of unity, and people waking up to see the value within themselves," she says. "I think that's what's lacking today."
Much of what makes Sargeant X Comrade's music so refreshing is their somewhat unstructured and intimate approach, many of their tracks feel like an on-the-spot effortless jam session about whatever was on their minds that day – something that Bykovets refers to as "the magic." To add to this magic, Bykovets enjoys scouring for unexpected samples to build around. Many still possess a personal twist. He names the score of a 1960s Soviet movie and encrypted radio transmissions from the Cold War era as some of his favourite discoveries to pop up on this latest project.
Sergeant X Comrade also give a modern-day lyrical update to Gil Scott-Heron's legendary "The Revolution Will Not Be Televised," the rap pioneer's message still ringing true today. The album's title, The Elephant in the Room, ultimately becomes twofold – not only does it refer to the social issues that get swept under the rug, but both Sargeant and Bykovets report having felt like the famously ignored elephant themselves, dedicating their work to all the other elephants listening. "There's a lot of elephants out there," Bykovets says with a chuckle. "So many people feel so alone, but if you feel like you're the only elephant, there are 'elephants' in the room," Sargeant adds.
Regardless of what kind of elephant you are, Sargeant X Comrade hope that their work helps you to find your herd.
By Sarah Morrison
Rock and roll innovator Kyle Thomas reminds us there's no place like home with new album, Smalltown Stardust.
Lists, Music
By Stephan Boissonneault
Look sharp! It's Aquarius szn.
Album Reviews, Music
The Italian Eurovision champs' first majority-English album is full of roaring solos, raspy vocals, and delightful sleaze.
Our Favourite Posts
Top 25 Canadian Albums of 2022
Jonah Yano: Relationships in Sound
Five Noisy Canadian Bands You Need To Hear
Our 2023 Grammy Award Predictions
Alvvays: An East Coast State Of Mind


Did you know that most bloggers are writing something that equates to a personal diary? Not intentionally of course. But that's what happens when a blogger has no idea how the search engines (like Google) work. You would not believe how many people are out there blogging like crazy, writing fantastic content, but it's literally buried in the gobs of content on the web and no one is reading it.
Some bloggers just want readership just for the sake of having people see their work. Others want to bring in lots of traffic so they can make money from product sales or advertising. But, no one's buying anything if no one's showing up in the first place.
A website or blog has the best chance of being found if it lands on page one of Google search results.
So how does one design a blog that will bring traffic to the site??
Sorry to have to bring up that up that scary, scary acronym. It's really only scary because SEO articles usually mention things like "analytics," "metatags," "co-citation." Not going to happen here. This one's for you, blogger who doesn't care to muddle through SEO jargon. Nevertheless, you must accept the reality that attracting an online audience requires SEO and SEO begins with keywords.
First narrow down your theme or niche as best you can so you can find keywords to target and then work those keywords into your content.
Let's say your blog niche is celebrity culture and you intend to make money by selling ad space on your celebrity news blog. You want people who are searching on relevant keywords like "Justin Bieber," "Kardashians," "Downton Abbey," "American Idol," "paparazzi photos," "celebrity gossip" "Academy Award winners," etc. to find your blog.
When people search on those keywords, you want your blog to appear on page one of Google search. That's a great plan. Really great. But, not gonna happen. Run a Google search on any of those keywords (put the phrase in quotes as shown below) and you'll see a huge number of search results.
Use the Google Keyword Tool and plug in a keyword on which you'd like to rank (it can be a highly competitive keyword). Under "match types," click the "exact match" box.
The keyword tool will show you a list of related keywords and the number of local monthly searches and global monthly searches for each. Start making a list of possible keywords that have some monthly search volume–more than zero!
Now, take the keywords that look interesting to you, put them in quotes, and do a Google search to assess the competition. Ordinarily, you stand a decent chance of ranking on page one with a keyword that has less than 25,000 search results. Once you get more familiar with keyword research, you'll figure out the right search competition number for your specific blog niche. It may be higher or lower than 25,000. Unfortunately, there's no exact formula for keyword research.
The keywords or keyword phrases you're going after get a relatively small number of searches. When you get ranked on page one for those small volume keywords, you'll get some traffic. This is where your writing talent makes a difference. Your content has to be good. Your content has to make people want to read your blog and come back for more.
Here's a little secret: the keywords don't always drop in to your content naturally. That's your next challenge–to write great content that makes your keywords work in your content without feeling terribly clunky and awkward.
Now that you understand how to incorporate "rankable" keywords into your content, you can move on to content marketing, link building, connecting on social media and all of the other things you can do to improve your blog's search rankings. In other words, learn about SEO and stop talking to yourself.


Market timing indicators based on moving averages have been around for more than 50 years. Their popularity increased substantially when Faber published a paper in 2007 showing a 10 month moving average signal outperforming buy-and-hold for the S&P 500 over a 100 year period.
50-day and 200-day averages are probably the most common time frames. This indicator uses the 200 day moving average for the S&P 500, with a twist. If today's Simple Moving Average (SMA) is greater than the SMA calculated five trading days earlier, the signal is bullish. Otherwise, it's bearish. To reduce the whipsaw created by repeated signals as the S&P 500 crosses the moving average, the signal doesn't trigger until it's crossed the moving average by more than .01%. This means there are really three states: If the moving average has increase by more than .01% in the previous week, the signal is bullish. If it has decreased by more than .01% in the previous week, the signal is bearish. Otherwise, the signal is unchanged and remains in the state corresponding to its most recent signal.
This indicator is one of three used in the Combination Indicator. The configuration used here was described by tpoto on 27 September 2008 in this post. More information can be found here.
Since 1970, this signal has had the following results. Interest rates and transaction costs are both ignored, i.e. assumed to be zero.


"Well done that was a huge success! We all really enjoyed the orchard talk & demo! Fun & informative & despite the cold went brilliantly! Delicious lunch too!"
amazing lunch, warm welcome,and most kind collecting of ice bound people. Neil's workshop was very useful to us."
"Many thanks for a superb day on Friday. I thoroughly enjoyed the day and applaud your initiative.
Lunch was delicious and the chocolate brownies were heavenly!"
"I just wanted to email, to thank you very much for a fantastic day and for your wonderful hospitality. I had a thoroughly enjoyable day."
"Many thanks for a most enjoyable and inspiring day - I came away feeling that at last I have got an idea of how to proceed with beautifying my muddy patch."
"I thought Amanda was wonderful - very inspiring and informative. Thank you for making it all so lovely with your delicious cooking and pretty barn."
"What a day ..... I got back home reeling with information and ideas (and extremely fat!). I learnt a lot and am now desperate to put some of it into practice. I thought Amanda was lovely and very approachable and extremely tolerant of a bunch of mad women.
"Thank you so much, I really did have a wonderful time and it got the grey matter working again remembering all the Latin names (ouch).
"Can't wait for the Wild Meadow Day on 27th April."
either side of it. It was inspirational to listen to Charles .. Please put us on your mailing list for any future events and thank you again for a day we will never forget."
"Thank you for a lovely day on Friday - lots of good things to think about and a delicous lunch too."
"Thanks for a very enjoyable and interesting course and the best food that I've ever had on a course!
"Thanks for organising the fab cooking demonstration yesterday. All those ladies loved it and we feel inspired to get on and try them out! The barn looked great and creates a cosy atmosphere."
"What a lovely day,I really enjoyed the David Austin morning ( lucky with the weather !),now I know I no longer need to stress over the pruning!"
"Thank you for such an amazing morning! The course was excellent. Your whole set-up there is just incredible and I cannot wait to return!"
"It was a great morning and really helpful. It took some of the mysteries out of keeping chickens and made it seem not too difficult for a beginner like me! Well done for organising it all, and the cakes were utterly delicious, with your yummy fresh eggs! Great fun crowd too!


I knew what she was saying was true. I was C-student. My best friend and I thought it wasn't cool to do homework. We cruised through grammar school with C's, except in the seventh grade. In the seventh grade I had a teacher who took a special interest in each one of us. Indeed, he saw the best in us, and we responded. He gave us additional work. He added Latin and Algebra to the curriculum, which was not then being taught in grammar school. I started getting A's and B's in the regular subjects, and an A in Latin. In the eighth grade, under different teachers, I reverted to my old habit of C's.
In high school, my habit of getting C's continued, except on the rare occasion a teacher motivated my interest, in which case I responded with As and Bs. Entering college, I was told my C's in high school would translate into D's, unless I worked harder. It was true. After one semester I was put on academic probation, and the semester after that academic suspension. I was kicked out for underperforming, and so was my cool friend. Only he had no desire to return and was drafted into the army. I did have the desire and barely escaped being drafted. Someone suggested I take a class in journalism, because it was an easy A. I needed an easy A to boost my slumping GPA. The purpose of the class was putting out the weekly newspaper. After one semester, I was totally submerged in the process—writing, editing, layout, headline writing, even the grunt work of checking the galley proofs for errors. I was made page editor, and then editor-in-chief. Despite working 30 hours a week pumping gas and carrying 12 units, I led the class in getting the paper out on time every week. And it motivated me to becoming a better student (actually studying for exams—a novel experience).
Where I excelled was in writing term papers. Except for my very first paper I started getting A's. About that first term paper . . . it was for an English class. I put off reading and writing until the last possible moment—the weekend before the paper was due. I cracked the books Friday night and began taking notes. By Saturday afternoon, I was totally absorbed in the subject—and surprised to be. Sunday night, when I sat down at the typewriter, I knew I had an A paper—if I could get it done on time. I worked all night and well into the morning. At eleven o'clock, I handed the paper in, feeling as if I'd climbed Mt. Everest. Triumph! Two days later, the paper was handed back with a D-minus scrawled on the title page. I was crushed.
A day or two later I met with my English professor. Tactlessly, I asked him if he'd read it. He was stung by the question, and forcefully assured me he had. I was given a D-minus, he said, because I hadn't followed the rules. The table of contents, footnotes, and bibliography did not meet his standard. I knew that. I hadn't had time, rushed as I was at the end. But these were small things. Didn't content matter? Didn't my analysis of the material, grammar, spelling, and punctuation count for something? Apparently not. My table of contents, footnotes, and bibliography did not meet his rigid standard, period. To this day, I don't believe he did read my paper. But I learned a valuable lesson. Never again did I procrastinate. When it came to term papers, I did the research early, followed the format to the letter, spent time writing and polishing the text, and never again scored less than an A-minus.
In the fall of my senior year I took a course in Constitutional Law (Con Law I). It required a great deal of reading and legal analysis and was the hardest class I ever took. It was an eye-opening experience. I got so much out of the class I took Con Law II in the spring. The professor was gruff and distant, but passionate about the subject. The few times I met with him, however, we ended up talking more about football than the law. He didn't assign textbooks. We read Supreme Court decisions directly from the law books in the college library. There weren't always enough law books to go around, and I remember sometimes having to drive to a nearby law school to read the assigned cases. We read both the majority and the dissenting opinions. It was tedious, but enthralling, too. Both opinions cited applicable state and federal laws and various legal precedents, and concluded with impressive reasoning and logic. Mind you, both decisions referenced much of the same material, were equally persuasive in their reasoning, yet drew completely different conclusions.
In the end, the most important court decisions—the ones that have stood the test of time—have not been so much about citing law and precedent as about simple human decency and fair play. Some of the most appallingly inhumane decisions have been written by justices who adhered to the strict letter of the law. "The life of the law has not been logic," wrote Justice Oliver Wendell Holmes, "it has been experience." Chief justice John Marshall, who established the legal precedent of judicial review, rarely cited law. He left that to others.
What I learned taking Con Law I and II is that nothing is what it appears to be on first blush. Discovering the truth is more than a mere examination of the facts and applying the law. The scale of justice is part science and part art. There's no formula. If there were, Supreme Court justices would have nothing to debate and all court decisions would be unanimous. Arriving at a decision requires a judge to examine the human heart. Whenever I hear people disparage Supreme Court decisions, I tell them to go to the source—read the decisions. It will open your eyes.
I graduated from college but that didn't stop my education. I had a long list of books to read, a list I had been compiling since my junior year. And it didn't stop there, but continues to this day. For me, reading connects the dots. In speaking with Ruth over lunch, I was reminded that everyone possesses the ability to be an A-student. The spark is there, it's the gift we've all been given. It just needs something or someone to ignite it. The fitness experts say that inside every fat person is a skinny person trying to get out. Ruth implied as much: inside every C-student is an A-student trying to get out.


text:
Baja California Culinary Fest 2013: An Appetizing Array of Food & Events
Posted on October 18, 2013 by W. Scott Koenig in Baja California, Ensenada, Events, Fiestas & Holidays, Food, News from Mexico, Rosarito Beach, Tijuana, Valle de Guadalupe // 1 Comment
TIJUANA - On Thursday, November 14, a press event to kick off the 3rd Annual Baja California Culinary Fest was held at Chef Martin Gonzales' TOAST Enoteca and Cucina restaurant in San Diego's East Village. El Gringo joined other members of the foodie press to learn more. The fest will celebrate the region's artisanal food, premium wines and craft beers throughout Baja California, October 24-27. Featuring special dinners, tastings, cooking classes, competitions and entertainment, the region's distinctive gourmet fare will take center stage with 25 of Baja California's culinary stars and top sommeliers. A significant driver of tourism, Baja's cuisine was recently declared an intangible cultural heritage to the state by the World Tourism Organization (WTO).
Chef Javier Plascencia shares samples and chats with members of the press.
Baja California Culinary Fest 2013.
As with other events held for the press recently focused on Baja cuisine, there were a variety of wines from Baja's Valle de Guadalupe region. El Gringo sampled several vino tintos and mingled with other press members, discussing the culinary fest, the growing popularity of Baja cuisine, Tijuana as a gastronomic capital and the rebirth of the ciudad as a premier food and cultural destination. As I tipped the last bit of the rich, red grapey goodness from my glass, we were led to the area of the restaurant where the press conference was about to begin.
The 2013 Baja California Culinary Fest kicks off at Toast Enoteca & Cucina in San Diego.
Speaking today were Chef Martin Gonzales of TOAST, Fernando Gaxiola, event organizer, Secretary of Baja Tourism Juan Tintos Fuenke and Tijuana Top Chef, Javier Plascencia. Secretary Tintos opened with a few statements regarding the phenomenal popularity of Baja California as a new food capital. "People used to come to Baja for the beaches. Now, they come to Baja for dinner. Whether it's seafood in Ensenada or Tacos from Tijuana, Baja's cuisine comes from the street and has become elevated to new levels of gastronomy in Tijuana." Tintos continued, "Baja now has two of the top fifty restaurants in all of Latin America. We have 18 wine growing valleys, the only Baja producer of artisan cheese and 65 producers of craft beer. This event, which is now three years old, will showcase the culinary movement of Baja California."
Press Conference for the 2013 Baja California Culinary Fest.
Fernando Gaxiola from Baja Wine + Food, one of the event organizers, focused on the beautiful and bountiful wine-producing region of Valle de Guadalupe and the culinary tour there on Sunday, October 27th. "This culinary tour will take place all over Valle de Guadalupe." Gaxiola enthused. The tour includes Valle wines and top restaurants Malva, Almazara, Latitud 32 and Finca Altozano that will present cuisine from host chefs Roberto Alcocer, Alenjandro Alvarez, Ryan Steyn and Javier Plascencia, respectively. The tour is from 11AM to 6PM and is only $750 Pesos (about $60). What a bargain to experience the best that Baja has to offer!
Wines from Valle de Guadalupe will be featured during the Culinary Fest.
Next up was Chef Javier Plascencia, of Mision 19, Erizo and other restaurants owned and operated by his family in Tijuana. Chef Plascencia announced that the Baja Culinary Fest will kickoff on Thursday, October 24th, with a competition for new culinary talent in Baja California. The event will take place at the Culinary Art School in Tijuana from 8AM until 2PM and features a panel of judges (including Plascencia himself as well as noted chefs Miguel Angel Guerrero, Eduardo Plascencia and others). Plascencia also discussed the Culinary Expo which will be occurring at the Tijuana Cultural Center every day…and is open for free to the public. The expo will feature food, beer and wine tastings as well as demos, movies and presentations, which will also be translated into English for non-Spanish speakers. Oh, and there will be an opera performed by Tijuana troupe Santini & Cardini called "Una Historia Con Sabor", about the creation and presentation of the Caesar Salad at Caesar's restaurant in Tijuana (also owned by the Plascencia family). Spoiler Alert: The salad is drowned in dressing and anchovies then devoured in the end.
Additionally, Club Tengo Hambre and El Gringo's friends and hosts Antonio and Kristin Diaz Sandi (of Life & Food blog), will be operating two culinary "experiences" during the event. The first, Tijuana Dining and Craft Beer Outing, is October 25th. The second is "A Tale of Two Seas" Tijuana Seafood and Craft Beer outing. With stops at some of Baja California Norte's most tantalizingly tastiest spots and onboard Mescal service, these outings are sure to be fun, appetizing and something you'll talk about to your amigos and amigas for years to come!
Club Tengo Hambre has two fun events planned during the Baja Culinary Fest.
When the press conference concluded, we were served some amazing hor d'oeuvres prepared by Chef Plascencia and his staff. The oysters with meat and fritter were smooth and delicious. I salivated when I was presented with a plateful of giant callo de hacha scallops served on a tortilla chip. The final dish was a preparation of ahi tuna belly on a tostada, caught off the coast of Baja. "We will be breaking down an entire tuna the first day of the Culinary Fest and serving it as sashimi and sushi," Plascencia told me. Say no more chef…you had me at tuna! El Gringo couldn't help but share his recent first yellowfin catch off the coast of Ensenada with the chef, but stopped short of breaking out the hero shot on his iPhone!
Chef Javier Plascencia's oysters with beef and fritter were a tasty sample of what's to come.
Delicious tuna belly ceviche served atop a tostada.
As the journalists spilled out of TOAST and into the full moonlit night, El Gringo met Chef Plascencia's personal assistant. In addition to her myriad duties for the chef – which may include picking up live goats for his restaurants – Diana Jimenez was also very well versed in the cultural scene of Tijuana. Earlier, I had asked Secretary Tintos about his views on presenting Baja California Norte to a wider US audience, and now asked a similar question of Diana. Would Tijuana like to see the return of the "droves" of tourists that came first during US prohibition and later to party hard on Revolucion? "Well, cultural tourism does not necessarily come in droves." Diana opined. "We do welcome all of our visitors, but this is a different and better time for the city. The art and culture scene have always been here. The food is what's new and exciting."'
For more information, check out the Baja California Culinary Festival on Facebook.
Your Gringo in Mexico,
#BCCulinaryFest
baja culinary fest 2013
Baja-Med
javier plascencia
Mexican Wines
tijuana cuisine
tijuana cultural center
And in this Corner…
Chef Javier Plascencia back in the ring for Misión 19's Fifth Anniversary
What's in a Nombre?
Baja California restaurateur proposes new name for regional cuisine
WTF at Tijuana's "The Kitchen": 12 hedonists. 12 courses. 1 vision.
Tijuana Cuisine: From the Street to Baja Med
A Gringo in Mexico: The Best of 2014
The year's best food, destinations, culture and personalities.
1 Comment on Baja California Culinary Fest 2013: An Appetizing Array of Food & Events
bajasyaltas // March 30, 2014 at 6:04 am	// Reply
Reblogged this on la trinidad.