;;; services ;; To add or remove services, modify the service definitions and/or the list of provided services. (use ursetto-html) (define-element p) ;;; service type and accessors (define (service id name summary . text) `(service ,id ,name ,summary ,text)) (define (service-id s) (cadr s)) (define (service-name s) (caddr s)) (define (service-summary s) (cadddr s)) (define (service-text s) (cadr (cdddr s))) (define (service-filename s) (conc (service-id s) ".html")) ;;; service links lookup (up here due to use inside service defs) ;; Quick service lookup for links (in provided services). Recommend this ;; way instead of using the service definition directly to ensure we error ;; out on dead link. (use srfi-1) ; find (define (service-lookup id) (or (find (lambda (s) (eq? id (service-id s))) *services*) (error 'service-lookup "no such service id " id))) (define (service-link id . desc) ;; Provide a thunk to the transformer for later execution, because ;; service-lookup should only be called after all services are defined. (lambda () (link (service-filename (service-lookup id)) desc))) ;;; service definitions (define service:ha (service 'ha "High availability" "Maximize uptime and protect critical systems." (p "If you're like most businesses, you need to maximize the uptime of your critical applications. Ursetto Consulting, Inc. can configure, document and maintain MC/ServiceGuard clusters, protecting you against failure and facilitating rolling upgrades.") (p "My services are far more comprehensive than the plain-vanilla vendor quickstart, which will ignore the particulars of your environment. Every situation is unique, and I specialize in custom cluster scripting and unusual clustering situations."))) (define service:large-sites (service 'large "Large sites" "Centralize your services." (p "When you have hundreds of machines and even more users arrayed in a distributed environment, proper management tools become critical. NFS centralizes your storage, so your filesystems are accessible throughout the network. NIS centralizes directory information, such as user IDs and passwords. Together, they greatly simplify administration, and permit users to access their desktops and data transparently from any machine. Ursetto Consulting, Inc. is experienced in configuring both NFS and NIS in large, multi-platform environments."))) (define service:remote-admin (service 'remote "Remote admin" "Manage remote machines securely and conveniently." (p "To achieve maximum productivity, one must effectively balance security and convenience when remotely administering a large number of systems. However, most installations tend to either extreme: zero convenience, or zero security.") (p "In the former case, administrators are forced to manually log in to each machine, tying up valuable resources when performing a global change or audit. Usually, the login method sends easily-capturable, unencrypted passwords, cancelling out any security benefit.") (p "In the latter case, automated login is accomplished through an insecure authentication method such as rlogin, providing minimal protection from an attacker.") (p "The best solution resides somewhere in the middle, utilizing standard, secure components and practices. Ursetto Consulting, Inc. possesses the know-how and experience to implement an efficient remote administration environment, without sacrificing security or convenience."))) (define service:scripting (service 'scripting "Scripting" "Automate routine tasks." (p "Ursetto Consulting, Inc. can increase your productivity by automating and simplifying routine tasks. Security audits, application distribution, and even health monitoring are accomplished much more easily when scripted. Plus, a graphical front-end to a utility such as LVM can be very convenient to even the most seasoned administrator.") (p "Finally, automation will help you get the most out of a well-designed " (service-link 'remote "remote administration") " environment. " (category-link 'contact "Find out how.")))) (define service:programming (service 'program "Programming" "Create and optimize applications." (p "Ursetto Consulting, Inc. can tackle complex programming projects, from design to implementation. I'll always choose the right tool for the job, whether it be Perl, C, or even assembly. For graphical applications, I highly recommend wxPython for quick development and portability.") (p "Furthermore, I have proven experience in optimizing existing code, which may help you delay or avoid costly hardware upgrades. Ursetto Consulting, Inc. strives to produce well-documented and maintainable code.") ;; (p "Examples of programming projects can be found on the " ;; (category-link 'projects "Projects") " page.") )) (define service:open-source (service 'opensource "Open source" "Save money, enhance security." (p "Reputable companies are lining up behind it. System administrators worldwide rely on it. " "So why should it be a part of " '(em "your") " technology strategy?") (p "Quite simply, open source saves you money, and that's a big advantage in today's marketplace. " "But there are several other important benefits:" `(ul (li "Access to a large community of developers and testers, intimately familiar with the product. " "Paid support contracts are available as well.") (li "Enhanced security, since the code can be scrutinized and fixed by anyone.") (li "Protection against a vendor who is slow to issue patches " "or even goes out of business.") (li "You won't sacrifice precious time and security by reinventing the wheel."))) (p "So, whether you're interested in Linux, Apache, Samba, or another open source solution, Ursetto Consulting, Inc. can " (category-link 'contact "help") " you address your business problems."))) (define service:l10n (service 'lang "Localization" "Branch out into new languages." (p " Do you need help with internationalization (i18n) or localization (l10n) of your UNIX workstations and servers? Ursetto Consulting, Inc. can configure your X Windows systems for both input and output of the languages of your choice."))) (define service:documentation (service 'document "Documentation" "Document your code and processes." (p "Ursetto Consulting, Inc. can document your existing technology processes, codify new ones, and produce whitepapers uniquely tailored to your environment. I can also create or update documentation for existing code, even reconciling differences between expected and actual behavior.") (p "The company draws on my excellent written and verbal communication skills" (& 'mdash) "the same skills that help me work with your business to find the most appropriate technology solution for you."))) (define service:research (service 'research "Research" "Find out about your choice of topics." (p "Ursetto Consulting, Inc. would be happy to research the computer topic of your choice, and provide a summary or detailed write-up.") (p "Examples might include how best to leverage the power of open source in your business, or whether it's feasible to replace NIS with " (link "http://www.openldap.org" "LDAP") ". " "Or perhaps you'd like a high-level overview of various authentication methods, paired with an in-depth technical discussion of " (link "http://web.mit.edu/kerberos/www/" "Kerberos") " and SSH public key authentication for your administrators. ") (p "The possibilities are limitless. " (category-link 'contact "Contact Ursetto Consulting") " for more details."))) ;;; provided services, in order (define *services* (list service:programming service:scripting service:large-sites service:remote-admin service:open-source service:ha service:documentation service:l10n service:research)) ;;; subpage helpers (define (sub-service-link s) (if (or (null? s) (not s)) (category-link 'services "Services") (link (service-filename s) (service-name s)))) (define (subnav prev next) `(div (@ (class "subnav")) (div (@ (class "prevpage")) (span (@ (class "direction")) ,(& 'laquo)) " " ,(sub-service-link prev)) (span (@ (class "separator")) " / ") (div (@ (class "nextpage")) ,(sub-service-link next) " " (span (@ (class "direction")) ,(& 'raquo))) ,(clear))) ;;; subpage and main page contents (define (sub-services-page s prev next) (page (conc "Ursetto Consulting, Inc. - Consulting Services - " (service-name s)) 'services (content (subnav prev next) `(h3 (@ (class "service")) ,(service-name s)) (service-text s) (subnav prev next)))) (define (main-services-page services) (page "Ursetto Consulting, Inc. - Consulting Services" 'services (content (p "Ursetto Consulting, Inc. offers a number of computer services. Select from the following to learn more.") `(table (@ (class "services")) ,@(map (lambda (s) `(tr (th ,(link `(,(service-filename s)) (raquo (service-name s)))) ;; th -- ok?? (td ,(service-summary s)))) services))))) ;;; rendering subpages ;; Render all service pages, passing the service and the result text to continuation K. (define (render-all-services services k) (let loop ((prev '()) (services services)) (cond ((null? services) 'render-complete) (else (let ((next (if (null? (cdr services)) #f (cadr services))) (s (car services))) (k s (xml (sub-services-page s prev next))) (loop s (cdr services))))))) ;; Suitable for render-all-services continuation. Dumps text to appropriate service HTML file. ;; DIR is optional dump directory (default: cwd). (define (to-subfile #!optional (dir #f)) (define (qualify-path fn) (if dir (string-append dir "/" fn) fn)) (lambda (s txt) (let ((fn (qualify-path (service-filename s)))) (fprintf (current-error-port) "Rendering service ~A to ~A\n" (service-id s) fn) (call-with-output-file fn (lambda (p) (display txt p)))))) ;;; main ;; Dumps main page to stdout, and subpages to subfiles. Script accepts ;; optional argument which is the directory to write subfiles into. (render (main-services-page *services*)) (render-all-services *services* (to-subfile (and (pair? (command-line-arguments)) (car (command-line-arguments)))))