The document provides instructions for creating a PHP extension module that wraps the libares asynchronous DNS resolving library. It begins by explaining why such an extension is useful and covers generating an extension skeleton, configuring the build system to find libares, the key C API functions to expose, and the basic anatomy of a PHP extension.
This document provides instructions for labs 5 and 6 of the IELM 511 course, which teach how to create and populate a database using phpMyAdmin. The labs will have students create tables in a MySQL database called "bank" using phpMyAdmin's GUI and SQL commands, and populate the tables with sample data. The document also introduces how to connect a PHP script to the database and execute queries.
PHP provides predefined variables like $_GET, $_POST, and $_SESSION to access important information from the server and user requests. $_GET and $_POST are used to send data from one PHP page to another via GET and POST methods in HTTP. $_SESSION is used to store temporary user data across multiple pages during a user's session by starting the session with session_start(). Data can be stored in and retrieved from $_SESSION, and sessions can be destroyed or have data removed using unset() or by setting a timeout interval.
PHP is a loosely typed scripting language commonly used for web development. It was created by Rasmus Lerdorf in 1995 and has evolved through several versions. PHP code is interpreted at runtime and allows for features like conditionals, loops, functions, classes, and objects to build dynamic web applications.
CakePHP is a PHP web development framework that follows the MVC pattern. It uses conventions over configuration, so table names, primary keys, and other structures follow standard naming conventions to reduce configuration. CakePHP 3 introduced entities/objects returned instead of arrays, separated and reusable validation, associations no longer defined as properties, and patching entities to remove unneeded data. It also defaults to not retrieving associated data to avoid bloated queries. CakePHP 3 supports PHP 5.4.16+ and requires the mbstring and intl extensions. While migration tools exist, a full migration from CakePHP 2 to 3 is not recommended due to changes, and a redesign adopting CakePHP 3 standards is suggested instead.
The document discusses SQLite, including that it is a file-based, single-user, cross-platform SQL database engine. It provides information on SQLite tools like SQLite Manager and the sqlite3 command line utility. It also covers how to use the SQLite API in iOS/macOS applications, including opening a database connection, executing queries, and using prepared statements. Key aspects covered are getting the documents directory path, copying a default database on app startup, and the callback signature for query results.
This document discusses setting up an Apache web server with virtual domains and dynamic CGI pages. It provides instructions for installing and configuring Apache from source, including a sample httpd.conf configuration file. It also describes a simple shell script-based web server for testing purposes.
The document discusses programming for fun and enjoyment. It provides tips on using Vim and Ruby for fun programming projects. It also discusses Ruby programming concepts like classes and threads. Finally, it promotes programming meetups and brigades as a way to socially engage with other programmers.
Puppet is an open source tool used to automate server configuration management. It ensures servers are configured and packages installed as defined. Puppet manages configuration through resources like packages, files, users and more. It can install packages, configure files and folders, manage services, create users/groups, and run commands. Puppet applies configurations idempotently so they can be run multiple times without changing the server unless the configuration changes.
The document introduces PHP as a server-side scripting language that is easy to learn and commonly used with the LAMP stack. It provides examples of basic PHP syntax for variables, arrays, functions, and interacting with URLs and external data sources. The goal is to teach enough PHP to handle simple requests and parse/generate XML and JSON through practical code examples.
To upload files from a browser to a server using PHP, an HTML form allows users to select a file to upload. PHP code then moves the uploaded file to the specified target folder. Session variables store user information across pages, while cookies identify users by embedding a small file on their computer. Common PHP errors include notices, warnings, and fatal errors. Functions like error_log() send errors to logs and parse_ini_file() parses configuration files.
This document provides a summary of new features in CakePHP 3.0 including:
- Frequent releases with bugfixes every 2-4 weeks and support for PHP 5.4 and above.
- Adoption of PSR standards and improvements to internationalization, routing, resource routing, collections, ORM, and entities.
- Key changes include standalone components, improved localization support, routing scopes and prefixes, resource routing, immutable and pipeline-friendly collections, active record and datamapper ORM patterns, and value objects.
- Many features can also be used independently of CakePHP.
The document provides steps for installing MySQL on Windows, describes basic SQL commands like CREATE, SELECT, INSERT, UPDATE and DELETE. It also covers how to create databases and tables, grant user privileges, and includes examples of various SQL statements.
This presentation talks about managing a session and cookies in web using PHP. Cookies are stored at client machine and sent back to the server after first consecutive requests.Session manages the user state on the web page for security purpose as well.
This document provides an overview of dependency injection and describes how to build a simple dependency injection container in PHP 5.3 using anonymous functions (lambdas). It discusses how the container can be used to manage parameters, describe object creation through lambdas, handle object scoping, and provide a unified interface. The container allows decoupling object dependencies and makes configuration and customization natural. Anonymous functions allow capturing context and scope, which is leveraged to implement features like shared instances. Overall, the document shows how lambdas can power a fully-featured yet concise dependency injection container in PHP.
New: Two Methods of Installing Drupal on Windows XP with XAMPP
This document provides step-by-step instructions for installing Drupal, an open-source content management system, using XAMPP, a local web server environment, on a Windows computer. It describes downloading and setting up XAMPP, creating a MySQL database, extracting and configuring Drupal files, and navigating through the Drupal installation process to set up the site.
This document appears to be a weekly update from an intro to computer science course. It includes summaries of classmates' demographics, comfort levels, and prior experience. It also discusses time spent on problem sets and recommends upcoming courses in CS51 and CS61. Finally, it recommends reading on topics like TCP/IP, HTTP, XHTML, CSS, PHP, SQL and using bulletin boards, and includes images related to these topics.
Django is a Python-based web framework that allows for rapid development of complex, database-driven websites. It was developed by a newspaper company and released publicly in 2005 under a BSD license. Django aims to reduce duplication through reusability of code and components like its model-template-view architecture, administration interface, authentication system, and generic class-based views. It includes features like pluggable applications, deployment options via WSGI or mod_python, and scalability.
This document provides an introduction to using PHP with MySQL for beginners. It covers establishing a database connection, selecting a database, querying and manipulating data, and retrieving result rows and field metadata. Common PHP functions for MySQL like mysql_connect(), mysql_query(), mysql_fetch_array() and their usage is explained through examples. It also includes SQL scripts for creating a sample database table and inserting records.
This document provides an introduction and instructions for connecting a PHP application to a MySQL database. It discusses storing and retrieving data from the database. The key steps covered are:
1. Connecting to the MySQL server from PHP using mysql_connect().
2. Selecting the database to use with mysql_select_db().
3. Executing SQL queries to store/retrieve data with mysql_query().
4. Different mysql_fetch_* functions that can be used to retrieve rows of data from a database query.
An example task is provided where a registration form allows storing user data to a database table, and then retrieving and displaying the stored data in a table.
This document provides an overview and examples of using PHP and MySQL together for database applications. It begins with a brief review of MySQL including using the command line client and creating database tables. It then covers the basic PHP MySQL functions for connecting to a database, making queries, accessing and processing query results, and freeing resources. Examples are provided for each function. It concludes with a more complex example that displays the contents of a books database table using these PHP MySQL functions.
This document provides instructions for labs 5 and 6 of the IELM 511 course, which teach how to create and populate a database using phpMyAdmin. The labs will have students create tables in a MySQL database called "bank" using phpMyAdmin's GUI and SQL commands, and populate the tables with sample data. The document also introduces how to connect a PHP script to the database and execute queries.
PHP provides predefined variables like $_GET, $_POST, and $_SESSION to access important information from the server and user requests. $_GET and $_POST are used to send data from one PHP page to another via GET and POST methods in HTTP. $_SESSION is used to store temporary user data across multiple pages during a user's session by starting the session with session_start(). Data can be stored in and retrieved from $_SESSION, and sessions can be destroyed or have data removed using unset() or by setting a timeout interval.
PHP is a loosely typed scripting language commonly used for web development. It was created by Rasmus Lerdorf in 1995 and has evolved through several versions. PHP code is interpreted at runtime and allows for features like conditionals, loops, functions, classes, and objects to build dynamic web applications.
CakePHP is a PHP web development framework that follows the MVC pattern. It uses conventions over configuration, so table names, primary keys, and other structures follow standard naming conventions to reduce configuration. CakePHP 3 introduced entities/objects returned instead of arrays, separated and reusable validation, associations no longer defined as properties, and patching entities to remove unneeded data. It also defaults to not retrieving associated data to avoid bloated queries. CakePHP 3 supports PHP 5.4.16+ and requires the mbstring and intl extensions. While migration tools exist, a full migration from CakePHP 2 to 3 is not recommended due to changes, and a redesign adopting CakePHP 3 standards is suggested instead.
The document discusses SQLite, including that it is a file-based, single-user, cross-platform SQL database engine. It provides information on SQLite tools like SQLite Manager and the sqlite3 command line utility. It also covers how to use the SQLite API in iOS/macOS applications, including opening a database connection, executing queries, and using prepared statements. Key aspects covered are getting the documents directory path, copying a default database on app startup, and the callback signature for query results.
This document discusses setting up an Apache web server with virtual domains and dynamic CGI pages. It provides instructions for installing and configuring Apache from source, including a sample httpd.conf configuration file. It also describes a simple shell script-based web server for testing purposes.
The document discusses programming for fun and enjoyment. It provides tips on using Vim and Ruby for fun programming projects. It also discusses Ruby programming concepts like classes and threads. Finally, it promotes programming meetups and brigades as a way to socially engage with other programmers.
Puppet is an open source tool used to automate server configuration management. It ensures servers are configured and packages installed as defined. Puppet manages configuration through resources like packages, files, users and more. It can install packages, configure files and folders, manage services, create users/groups, and run commands. Puppet applies configurations idempotently so they can be run multiple times without changing the server unless the configuration changes.
The document introduces PHP as a server-side scripting language that is easy to learn and commonly used with the LAMP stack. It provides examples of basic PHP syntax for variables, arrays, functions, and interacting with URLs and external data sources. The goal is to teach enough PHP to handle simple requests and parse/generate XML and JSON through practical code examples.
To upload files from a browser to a server using PHP, an HTML form allows users to select a file to upload. PHP code then moves the uploaded file to the specified target folder. Session variables store user information across pages, while cookies identify users by embedding a small file on their computer. Common PHP errors include notices, warnings, and fatal errors. Functions like error_log() send errors to logs and parse_ini_file() parses configuration files.
This document provides a summary of new features in CakePHP 3.0 including:
- Frequent releases with bugfixes every 2-4 weeks and support for PHP 5.4 and above.
- Adoption of PSR standards and improvements to internationalization, routing, resource routing, collections, ORM, and entities.
- Key changes include standalone components, improved localization support, routing scopes and prefixes, resource routing, immutable and pipeline-friendly collections, active record and datamapper ORM patterns, and value objects.
- Many features can also be used independently of CakePHP.
The document provides steps for installing MySQL on Windows, describes basic SQL commands like CREATE, SELECT, INSERT, UPDATE and DELETE. It also covers how to create databases and tables, grant user privileges, and includes examples of various SQL statements.
This presentation talks about managing a session and cookies in web using PHP. Cookies are stored at client machine and sent back to the server after first consecutive requests.Session manages the user state on the web page for security purpose as well.
This document provides an overview of dependency injection and describes how to build a simple dependency injection container in PHP 5.3 using anonymous functions (lambdas). It discusses how the container can be used to manage parameters, describe object creation through lambdas, handle object scoping, and provide a unified interface. The container allows decoupling object dependencies and makes configuration and customization natural. Anonymous functions allow capturing context and scope, which is leveraged to implement features like shared instances. Overall, the document shows how lambdas can power a fully-featured yet concise dependency injection container in PHP.
New: Two Methods of Installing Drupal on Windows XP with XAMPPRupesh Kumar
This document provides step-by-step instructions for installing Drupal, an open-source content management system, using XAMPP, a local web server environment, on a Windows computer. It describes downloading and setting up XAMPP, creating a MySQL database, extracting and configuring Drupal files, and navigating through the Drupal installation process to set up the site.
This document appears to be a weekly update from an intro to computer science course. It includes summaries of classmates' demographics, comfort levels, and prior experience. It also discusses time spent on problem sets and recommends upcoming courses in CS51 and CS61. Finally, it recommends reading on topics like TCP/IP, HTTP, XHTML, CSS, PHP, SQL and using bulletin boards, and includes images related to these topics.
Django is a Python-based web framework that allows for rapid development of complex, database-driven websites. It was developed by a newspaper company and released publicly in 2005 under a BSD license. Django aims to reduce duplication through reusability of code and components like its model-template-view architecture, administration interface, authentication system, and generic class-based views. It includes features like pluggable applications, deployment options via WSGI or mod_python, and scalability.
Google App Engine allows users to develop and run web applications on Google's infrastructure without having to manage servers. It provides automatic scaling, a data store based on BigTable, user authentication through Google accounts, and scheduled tasks. Applications run in a secure sandbox and are only able to access other computers through HTTP and email. The SDK allows local development and testing before deploying apps to Google's servers from Windows or Mac computers.
The document discusses the importance for businesses to have an online presence and manage their online reputation. It recommends that businesses (1) register on all review sites and social networks to look accessible to customers, (2) have their own website to control their online search results, and (3) give away their expertise for free through content instead of traditional advertising which people dislike. Maintaining an online presence helps businesses respond to customer feedback and introduces prospective customers to accurate information about the company.
The document discusses revision control and the Mercurial revision control system. It provides an overview of revision control, describes how to install and use basic Mercurial commands like init, add, commit, status, log, diff, tag, push, pull, and serve. It also discusses configuring external diff tools and the .hgignore file.
The document provides an overview of HTML5 and its new features. It begins by explaining that HTML5 is not a programming language and is mainly used to write web pages. It then discusses how browsers have become application platforms, prompting the need to adopt HTML5. The document outlines some of the major new features in HTML5, including semantic elements like header and nav, new input types, geolocation, local storage, offline web applications, and video playback. It also addresses questions around the future of Flash and which companies are pushing adoption of HTML5.
This document provides an overview and introduction to LessCSS, a CSS pre-processor. It discusses key features of LessCSS like variables, nesting, mixins, functions and loops. It also provides examples of how to structure CSS with LessCSS by breaking it into partial files and importing them. Finally, it mentions similar CSS pre-processors like Sass and how to install and use LessCSS.
Apache CouchDB is a distributed, schema-free document-oriented database accessible via RESTful HTTP/JSON API. It provides features like replication with bi-directional conflict detection/resolution and queryable/indexable documents using JavaScript views. Each record is stored as a document with flexible structure. CouchDB embraces REST and uses JSON, avoiding complexity of XML. It allows querying and indexing documents with JavaScript and supports features like distributed architecture and replication between nodes.
How to Turn a Pile of Python Files Into an Open Source Project.
You have written some Python code, you think it would be useful to the world, and you would like to give back to the open source world. But where do you start? This talk will give you some guidance on how you can release your project
Training on php by cyber security infotech (csi). Cs-infotech is one of the best cyber security and website development company in India. we also provide Network security, software development, Cyber security corporate training and SEO and SMO services.
Our services are Employee Monitoring System,Employee Monitoring Software,Website Audit,Network Security,Network Audit and Information Security.
PHP is a server-side scripting language commonly used with the LAMP stack. It allows developers to easily create dynamic web pages. The document discusses PHP basics like variables, arrays, functions, and interacting with URLs, APIs, databases and more. It provides examples to demonstrate how to display data, parse XML/JSON, load content from web APIs, and talk to MySQL databases using PHP. Node.js is introduced as a JavaScript runtime that allows writing server-side code with JavaScript in an event-driven, non-blocking way.
Johannes Schlüter's PHPNW08 slides:
The current PHP version, PHP 5.3 introduced a multitude of new language features, most notably namespaces and late static binding, new extensions such as phar, as well as numerous other improvements. Even so, this power-packed release boasts better performance than older PHP releases. This talk will give you a good overview about PHP 5.3 and show some less known features in detail.
The document provides tips for optimizing PHP code, including using string functions instead of regular expressions where possible, passing references to reduce memory usage, using persistent database connections, and checking mysql_unbuffered_query() for faster queries. It also discusses HTTP requests and responses, cookie expiry, references in PHP, returning references from functions, and the debug_backtrace() function. The document concludes with tips for improving security such as checking for uninitialized variables, validating user input, and restricting access to included files.
PHP is a widely-used open source scripting language suited for web development. It allows embedding code into HTML pages to make them dynamic. PHP code is executed on the server and generates HTML that is sent to the client. Key features include using variables, conditional statements, loops, functions, and interacting with databases or external sources. The document provides an introduction to basic PHP syntax and constructs like variables, arrays, operators, control structures, and functions.
The document discusses various PHP wrappers that can be used to read and write data in non-standard ways and bypass security restrictions. It describes how wrappers like php://filter, zip://, and data:// can be used to read and write local files, modify file contents, bypass authentication, and perform XXE attacks. It also notes that filters in the php://filter wrapper can be used to selectively remove parts of file contents during I/O operations.
The document provides an overview and introduction to PHP including:
- PHP is a server-side scripting language used for web development. It was created by Rasmus Lerdorf in 1995.
- It discusses PHP basics like syntax, variables, strings, arrays, functions, and how to interact with forms and retrieve data from web pages.
- It also covers using PHP to communicate with backend databases and services to fetch and parse XML/JSON data.
PHP is a server-side scripting language commonly used for web development. The document provides an introduction to PHP including a brief history, how PHP scripts are parsed, variables, arrays, operators, control structures, and including external files. It discusses PHP's architecture and how scripts are executed on the server before being sent to the browser.
PHP is a server-side scripting language commonly used for web development. It allows developers to add dynamic content to websites. Key points:
- PHP scripts are executed on the server and output HTML, JavaScript, or other code to browsers.
- PHP supports variables, arrays, functions, classes, and control structures like if/else statements.
- External data like from text files or databases can be easily incorporated into dynamic web pages using PHP.
- PHP files have a .php extension and PHP code is delimited by <?php ?> tags within HTML files or standalone PHP files.
The document discusses Node.js and compares it to other technologies like CakePHP. It provides an overview of Node.js including its event-driven and asynchronous model, key features like the V8 engine and packages/modules, and frameworks like Express. It then demonstrates building a sample messaging application with a JSON API using both CakePHP and Node.js.
PHP is a server-side scripting language commonly used for web development. It allows developers to add dynamic content to websites. PHP code is embedded within HTML and executed on the server before the page is sent to the browser. The document provides an introduction and overview of PHP, covering its history, syntax based on Perl and C, how PHP scripts are parsed and executed, variables, arrays, operators, control structures like if/else and loops, functions to include external files, and how PHP can be used to retrieve and display external data.
The document provides an overview of the Lumen micro-framework by Laravel. It discusses Lumen's system requirements, how to install Lumen using Composer or the Lumen installer, configuring pretty URLs, the directory structure, HTTP routing, middleware, controllers, and views. Additional features covered include caching, databases, encryption, errors and logging, events, queues, testing, and more full-stack features like authentication and mail.
A set of rules and best practices to write bash shell scripts. Following these rules, you will have less programming errors and spend less time debugging.
It also shows and explains a lot of features from bash you didn't event know existed :
Pattern removal: ${var##*/}
StrReplace: ${var//search/replace}
Options: set -o pipefail -o nounset -o noclobber
And many more...
This document provides an introduction to PHP, covering its history, core concepts like variables, arrays, operators, control structures, and how to include external files. PHP is a server-side scripting language commonly used for web development. It was created in 1994 and has evolved through several versions. Key points covered include PHP's loose typing, how variables work and are assigned, the various operators available, using arrays to store multiple values, and control structures like if/else statements and loops to control program flow. The document also discusses including other files to reuse code and read external data files.
This document provides an introduction and overview of PHP. It begins with a brief history of PHP, noting it was created in 1994 and is now one of the premier open source projects. It discusses PHP's server-side scripting capabilities and mentions variables, arrays, operators, functions and control structures as topics that will be covered. The document provides background on PHP and how it is well-suited for dynamic web content. It also discusses PHP parsing and architecture.
This document provides instructions for installing Hadoop on a single node Ubuntu 14.04 system by setting up Java, SSH, creating Hadoop users and groups, downloading and configuring Hadoop, and formatting the HDFS filesystem. Key steps include installing Java and SSH, configuring SSH certificates for passwordless access, modifying configuration files like core-site.xml and hdfs-site.xml to specify directories, and starting Hadoop processes using start-all.sh.
This document discusses performance considerations with PHP 7. It describes how PHP 7 has a new compiler that optimizes code more at compile time compared to PHP 5. PHP 7 also has optimizations for variables, references, hashtables, strings, and encapsed strings that improve performance. These changes make PHP code run faster and be more efficient with memory and CPU cache usage compared to PHP 5.
PHP Basics is a presentation that introduces PHP. It discusses that PHP is a server-side scripting language used for building dynamic websites. It can be embedded into HTML. When a PHP file is requested, the server processes the PHP code and returns the output to the browser as HTML. The presentation covers PHP syntax, variables, data types, operators, functions, and conditional statements. It provides examples to illustrate basic PHP concepts and functionality.
This document provides an overview of Puppet, an open source configuration management tool. It discusses key Puppet concepts like infrastructure as code, reproducible setups, and aligned environments. It also describes Puppet's architecture including the Puppet master, agent nodes, catalogs, resources, and the lifecycle of a Puppet run. The Puppet language is declarative and node-based. Resources are defined and organized into classes. Relationships between resources can be specified.
This document provides a help and tutorial for TopStyle Pro version 3.11. It covers getting started with TopStyle, editing style sheets and HTML/XHTML, working with colors, previews, validation, site management, reports, mappings, customization, and third-party integration. It also includes appendices on CSS basics and tips, TopStyle tips and tricks, style sheet resources, keyboard shortcuts, and regular expressions.
TopStyle Help & <b>Tutorial</b>tutorialsruby
This document provides a table of contents for the TopStyle Pro Help & Tutorial, which teaches how to use the TopStyle software for editing style sheets and HTML/XHTML documents. It lists over 50 sections that provide explanations and instructions for features like creating and opening files, editing styles, working with colors, previews, validation, site management, reports and customizing the software. The document was created by Giampaolo Bellavite from the online help provided with TopStyle version 3.11.
The Art Institute of Atlanta IMD 210 Fundamentals of Scripting <b>...</b>tutorialsruby
This document provides the course outline for IMD 210 Fundamentals of Scripting Languages at The Art Institute of Atlanta during the Spring 2005 quarter. The course focuses on integrating programming concepts with interface design using scripting languages like JavaScript and CSS. It will cover topics like DOM, CSS layout, JavaScript variables, conditionals, and events. Students will complete 4 assignments including redesigning existing websites, and there will be weekly quizzes, a midterm, and final exam. The course is worth 4 credits and meets once a week for class and lab.
This document provides the course outline for IMD 210 Fundamentals of Scripting Languages at The Art Institute of Atlanta during the Spring 2005 quarter. The course focuses on integrating programming concepts with interface design using scripting languages like JavaScript and CSS. It will cover topics like DOM, CSS layout, JavaScript variables, conditionals, and events. Students will complete 4 assignments including redesigning existing websites, and there will be weekly quizzes, a midterm, and final exam. The course is worth 4 credits and meets once a week for class and lab.
The group aims to bridge gaps between peer-to-peer database architectures and scaling multimedia information retrieval. They develop a probabilistic multimedia database system with abstraction layers for applications and researchers. They also research challenges of peer-to-peer networks for distributed data management. Both lines are supported by the MonetDB platform to exploit custom hardware and adaptive query optimization. The goal is a modular solution linking theoretical optimal solutions to application demands under resource limitations.
Standardization and Knowledge Transfer – INS0tutorialsruby
The group aims to bridge gaps between peer-to-peer database architectures and scaling multimedia information retrieval. They develop a probabilistic multimedia database system with abstraction layers and a flexible model. They also research challenges of peer-to-peer networks for distributed data management. Both lines are supported by the MonetDB platform to exploit custom hardware and adaptive query optimization. The goal is a modular solution linking theoretical optimal solutions to application demands under resource limitations.
This document provides an introduction to converting HTML documents to XHTML, including the basic syntax changes needed like making all tags lowercase and closing all tags. It provides examples of correct XHTML markup for different tags. It also explains the new DOCTYPE declaration and shows a sample well-formed XHTML document incorporating all the discussed changes. Resources for learning more about XHTML are listed at the end.
This document provides an introduction to converting HTML documents to XHTML, including the basic syntax changes needed like making all tags lowercase and closing all tags. It provides examples of correct XHTML markup for different tags. It also explains the new DOCTYPE declaration and shows a sample well-formed XHTML document incorporating all the discussed changes. Resources for learning more about XHTML are listed at the end.
XHTML is a markup language that provides structure and semantics to web pages. It is based on XML and is more strict than HTML. XHTML pages must have a document type definition, html and head tags, and a body where the visible content goes. Common XHTML tags include paragraphs, lists, links, images, and divisions to logically separate content. While XHTML provides structure, CSS is used to style pages and control visual presentation by defining rules for tags. CSS rules are defined in external style sheets to keep presentation separate from structure and content.
XHTML is a markup language that provides structure and semantics to web pages. It is based on XML and is more strict than HTML. XHTML pages must have a document type definition, html and head tags, and a body where the visible content goes. Common XHTML tags include paragraphs, lists, links, images, and divisions to logically separate content. While XHTML provides structure, CSS is used to style pages and control visual presentation through rules that target specific XHTML elements.
This document discusses how to create and use external cascading style sheets (CSS) in Dreamweaver. It provides steps to:
1. Open the CSS Styles tab in Dreamweaver and create a new external CSS stylesheet using a sample text style.
2. Save the stylesheet and link it to a new HTML page to style elements like headings, text sizes, and boxes.
3. Edit existing styles by selecting a tag in the CSS Styles panel and modifying properties directly, or by clicking the tag and using the pencil icon to edit in a window. This allows customizing styles globally across all linked pages.
This document provides an overview of how to create and use cascading style sheets (CSS) in Dreamweaver. It describes the different types of style sheets, including external and internal style sheets. It outlines the steps to create an external style sheet in Dreamweaver using the CSS Styles panel and provides instructions for linking the external style sheet to an HTML page. The document demonstrates how to experiment with predefined styles and how to edit, add, and delete styles in the CSS stylesheet.
This document appears to be a weekly update from an intro to computer science course. It includes summaries of classmates' demographics, comfort levels, and prior experience. It also discusses time spent on problem sets and recommends upcoming courses in CS51 and CS61. Finally, it recommends reading on TCP/IP, HTTP, XHTML, CSS, PHP, SQL and using the bulletin board for questions.
The document discusses how to use Cascading Style Sheets (CSS) with Corvid Servlet Runtime templates to control formatting and layout. CSS allows separating design from content, making templates simpler and easier to maintain. It also enables adapting appearance for different devices. The document provides examples of using CSS classes to style template elements and explains how to set up a demo system using the included CSS and templates.
The document discusses how to use Cascading Style Sheets (CSS) with Corvid Servlet Runtime templates to control formatting and layout. CSS allows separating design from content, making templates simpler and easier to maintain. It also enables customization of appearance for different devices. The document provides examples of how to apply CSS classes and rules to Corvid template elements to control fonts, colors, positioning and more.
The document provides an introduction to CSS and how it works with HTML to control the presentation and styling of web page content. It explains basic CSS concepts like selectors, properties and values, and how CSS rules are used to target specific HTML elements and style them. Examples are given of common CSS properties and selectors and how they can be used to style elements and format the layout of web pages.
The document introduces CSS and how it works with HTML to separate content from presentation, allowing the styling of web pages through rules that target HTML elements. It explains CSS syntax and various selectors like type, class, ID, and descendant selectors. Examples are provided of how CSS can be used to style properties like color, font, padding, and layout of elements on a page.
Cascading Style Sheets (CSS) allow users to define how HTML elements are presented on a page. CSS enables changing the appearance and layout of an entire website by editing just one CSS file. CSS uses selectors to apply styles to HTML elements via properties and values. Styles can be defined internally in HTML or externally in CSS files. CSS can control text formatting, colors, spacing, positioning and more to achieve visual consistency across web pages.
Cascading Style Sheets (CSS) allow users to define how HTML elements are presented on a page. CSS enables changing the appearance and layout of an entire website by editing just one CSS file. CSS uses selectors to apply styles to HTML elements via properties and values. Styles can be defined internally in HTML or externally in CSS files. CSS can control text formatting, colors, spacing, positioning and more to achieve visual consistency across web pages.
This document provides instructions on using JavaScript to allow website visitors to select different cascading style sheets (CSS) and have their preference remembered via cookies. It discusses linking different types of style sheets, detecting browsers and objects, creating and reading cookies, and programming functions to get the current active style sheet and toggle between them when pages load and unload. Code snippets are provided to implement these functions to enable style sheet selection and remember the user's preference on future page visits.
Choose our Linux Web Hosting for a seamless and successful online presencerajancomputerfbd
Our Linux Web Hosting plans offer unbeatable performance, security, and scalability, ensuring your website runs smoothly and efficiently.
Visit- https://onliveserver.com/linux-web-hosting/
Best Practices for Effectively Running dbt in Airflow.pdfTatiana Al-Chueyr
As a popular open-source library for analytics engineering, dbt is often used in combination with Airflow. Orchestrating and executing dbt models as DAGs ensures an additional layer of control over tasks, observability, and provides a reliable, scalable environment to run dbt models.
This webinar will cover a step-by-step guide to Cosmos, an open source package from Astronomer that helps you easily run your dbt Core projects as Airflow DAGs and Task Groups, all with just a few lines of code. We’ll walk through:
- Standard ways of running dbt (and when to utilize other methods)
- How Cosmos can be used to run and visualize your dbt projects in Airflow
- Common challenges and how to address them, including performance, dependency conflicts, and more
- How running dbt projects in Airflow helps with cost optimization
Webinar given on 9 July 2024
Details of description part II: Describing images in practice - Tech Forum 2024BookNet Canada
This presentation explores the practical application of image description techniques. Familiar guidelines will be demonstrated in practice, and descriptions will be developed “live”! If you have learned a lot about the theory of image description techniques but want to feel more confident putting them into practice, this is the presentation for you. There will be useful, actionable information for everyone, whether you are working with authors, colleagues, alone, or leveraging AI as a collaborator.
Link to presentation recording and transcript: https://bnctechforum.ca/sessions/details-of-description-part-ii-describing-images-in-practice/
Presented by BookNet Canada on June 25, 2024, with support from the Department of Canadian Heritage.
UiPath Community Day Kraków: Devs4Devs ConferenceUiPathCommunity
We are honored to launch and host this event for our UiPath Polish Community, with the help of our partners - Proservartner!
We certainly hope we have managed to spike your interest in the subjects to be presented and the incredible networking opportunities at hand, too!
Check out our proposed agenda below 👇👇
08:30 ☕ Welcome coffee (30')
09:00 Opening note/ Intro to UiPath Community (10')
Cristina Vidu, Global Manager, Marketing Community @UiPath
Dawid Kot, Digital Transformation Lead @Proservartner
09:10 Cloud migration - Proservartner & DOVISTA case study (30')
Marcin Drozdowski, Automation CoE Manager @DOVISTA
Pawel Kamiński, RPA developer @DOVISTA
Mikolaj Zielinski, UiPath MVP, Senior Solutions Engineer @Proservartner
09:40 From bottlenecks to breakthroughs: Citizen Development in action (25')
Pawel Poplawski, Director, Improvement and Automation @McCormick & Company
Michał Cieślak, Senior Manager, Automation Programs @McCormick & Company
10:05 Next-level bots: API integration in UiPath Studio (30')
Mikolaj Zielinski, UiPath MVP, Senior Solutions Engineer @Proservartner
10:35 ☕ Coffee Break (15')
10:50 Document Understanding with my RPA Companion (45')
Ewa Gruszka, Enterprise Sales Specialist, AI & ML @UiPath
11:35 Power up your Robots: GenAI and GPT in REFramework (45')
Krzysztof Karaszewski, Global RPA Product Manager
12:20 🍕 Lunch Break (1hr)
13:20 From Concept to Quality: UiPath Test Suite for AI-powered Knowledge Bots (30')
Kamil Miśko, UiPath MVP, Senior RPA Developer @Zurich Insurance
13:50 Communications Mining - focus on AI capabilities (30')
Thomasz Wierzbicki, Business Analyst @Office Samurai
14:20 Polish MVP panel: Insights on MVP award achievements and career profiling
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...Toru Tamaki
Jindong Gu, Zhen Han, Shuo Chen, Ahmad Beirami, Bailan He, Gengyuan Zhang, Ruotong Liao, Yao Qin, Volker Tresp, Philip Torr "A Systematic Survey of Prompt Engineering on Vision-Language Foundation Models" arXiv2023
https://arxiv.org/abs/2307.12980
INDIAN AIR FORCE FIGHTER PLANES LIST.pdfjackson110191
These fighter aircraft have uses outside of traditional combat situations. They are essential in defending India's territorial integrity, averting dangers, and delivering aid to those in need during natural calamities. Additionally, the IAF improves its interoperability and fortifies international military alliances by working together and conducting joint exercises with other air forces.
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...Bert Blevins
Today’s digitally connected world presents a wide range of security challenges for enterprises. Insider security threats are particularly noteworthy because they have the potential to cause significant harm. Unlike external threats, insider risks originate from within the company, making them more subtle and challenging to identify. This blog aims to provide a comprehensive understanding of insider security threats, including their types, examples, effects, and mitigation techniques.
Transcript: Details of description part II: Describing images in practice - T...BookNet Canada
This presentation explores the practical application of image description techniques. Familiar guidelines will be demonstrated in practice, and descriptions will be developed “live”! If you have learned a lot about the theory of image description techniques but want to feel more confident putting them into practice, this is the presentation for you. There will be useful, actionable information for everyone, whether you are working with authors, colleagues, alone, or leveraging AI as a collaborator.
Link to presentation recording and slides: https://bnctechforum.ca/sessions/details-of-description-part-ii-describing-images-in-practice/
Presented by BookNet Canada on June 25, 2024, with support from the Department of Canadian Heritage.
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-InTrustArc
Six months into 2024, and it is clear the privacy ecosystem takes no days off!! Regulators continue to implement and enforce new regulations, businesses strive to meet requirements, and technology advances like AI have privacy professionals scratching their heads about managing risk.
What can we learn about the first six months of data privacy trends and events in 2024? How should this inform your privacy program management for the rest of the year?
Join TrustArc, Goodwin, and Snyk privacy experts as they discuss the changes we’ve seen in the first half of 2024 and gain insight into the concrete, actionable steps you can take to up-level your privacy program in the second half of the year.
This webinar will review:
- Key changes to privacy regulations in 2024
- Key themes in privacy and data governance in 2024
- How to maximize your privacy program in the second half of 2024
Implementations of Fused Deposition Modeling in real worldEmerging Tech
The presentation showcases the diverse real-world applications of Fused Deposition Modeling (FDM) across multiple industries:
1. **Manufacturing**: FDM is utilized in manufacturing for rapid prototyping, creating custom tools and fixtures, and producing functional end-use parts. Companies leverage its cost-effectiveness and flexibility to streamline production processes.
2. **Medical**: In the medical field, FDM is used to create patient-specific anatomical models, surgical guides, and prosthetics. Its ability to produce precise and biocompatible parts supports advancements in personalized healthcare solutions.
3. **Education**: FDM plays a crucial role in education by enabling students to learn about design and engineering through hands-on 3D printing projects. It promotes innovation and practical skill development in STEM disciplines.
4. **Science**: Researchers use FDM to prototype equipment for scientific experiments, build custom laboratory tools, and create models for visualization and testing purposes. It facilitates rapid iteration and customization in scientific endeavors.
5. **Automotive**: Automotive manufacturers employ FDM for prototyping vehicle components, tooling for assembly lines, and customized parts. It speeds up the design validation process and enhances efficiency in automotive engineering.
6. **Consumer Electronics**: FDM is utilized in consumer electronics for designing and prototyping product enclosures, casings, and internal components. It enables rapid iteration and customization to meet evolving consumer demands.
7. **Robotics**: Robotics engineers leverage FDM to prototype robot parts, create lightweight and durable components, and customize robot designs for specific applications. It supports innovation and optimization in robotic systems.
8. **Aerospace**: In aerospace, FDM is used to manufacture lightweight parts, complex geometries, and prototypes of aircraft components. It contributes to cost reduction, faster production cycles, and weight savings in aerospace engineering.
9. **Architecture**: Architects utilize FDM for creating detailed architectural models, prototypes of building components, and intricate designs. It aids in visualizing concepts, testing structural integrity, and communicating design ideas effectively.
Each industry example demonstrates how FDM enhances innovation, accelerates product development, and addresses specific challenges through advanced manufacturing capabilities.
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptxSynapseIndia
Your comprehensive guide to RPA in healthcare for 2024. Explore the benefits, use cases, and emerging trends of robotic process automation. Understand the challenges and prepare for the future of healthcare automation
7 Most Powerful Solar Storms in the History of Earth.pdfEnterprise Wired
Solar Storms (Geo Magnetic Storms) are the motion of accelerated charged particles in the solar environment with high velocities due to the coronal mass ejection (CME).
Support en anglais diffusé lors de l'événement 100% IA organisé dans les locaux parisiens d'Iguane Solutions, le mardi 2 juillet 2024 :
- Présentation de notre plateforme IA plug and play : ses fonctionnalités avancées, telles que son interface utilisateur intuitive, son copilot puissant et des outils de monitoring performants.
- REX client : Cyril Janssens, CTO d’ easybourse, partage son expérience d’utilisation de notre plateforme IA plug & play.
Measuring the Impact of Network Latency at TwitterScyllaDB
Widya Salim and Victor Ma will outline the causal impact analysis, framework, and key learnings used to quantify the impact of reducing Twitter's network latency.
Measuring the Impact of Network Latency at Twitter
extending-php
1. Extending PHP
Wez Furlong
wez@thebrainroom.com
PHP{Con West, Santa Clara, October 2003
2. Extending PHP
Sooner or later, you will find that PHP doesn't do everything that you need
it to do.
• No bindings for a particular library
• Might want to integrate PHP more tightly into your existing
systems (or vice versa)
• Maybe PHP script is too slow for performance critical parts of
your application
Rather than abandon (the otherwise perfect!) PHP and search for an
alternative language, it could easily be worthwhile to extend PHP to make
it do what you want.
3. What we will cover
• Generating an extension skeleton (ext_skel)
• config.m4 and the PHP build system
• Extension Anatomy 101
• PHP_FUNCTION
• Resources
• Parameter passing
We have 3 hours of interactive tutorial time; feel free to ask questions at
any point. Shout if I don't seem to have noticed you!
To give us focus, I've picked on an asynchronous DNS resolving library
and we'll create a PHP extension for it today, right now.
4. libares
Starting with PHP 4.3.0, it is now possible to write some pretty smart
multiplexing networking applications stream_select(). The only problem is
that the standard DNS functions gethostbyname() block the whole script
until the domain name resolves.
Wouldn't it be nice to have an alternative method of resolving DNS that
won't cause your existing sockets to time out?
We'll be using libares (written by Greg Hudson) as the basis of a PHP
extension that provides such an alternative method. libares is released
under an MIT license.
5. ares C API
Before we can write the extension, we have to have some knowledge of
the code that we want to expose to our PHP scripts.
Focusing on replacing gethostbyname(), ares provides the following
interesting functions:
interesting ares API
typedef void (*ares_host_callback)(void *arg, int status,
struct hostent *hostent);
int ares_init(ares_channel *channelptr);
void ares_destroy(ares_channel channel);
void ares_gethostbyname(ares_channel channel, const char *name,
int family, ares_host_callback callback, void *arg);
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
void ares_process(ares_channel channel, fd_set *read_fds,
fd_set *write_fds);
Typical usage for these functions (taken from the ahost example code in
ares distribution) looks something like this:
example of ares API in action
#include <ares.h>
/* gets called when the name has been resolved */
static void callback(void *arg, int status, struct hostent *host)
{
char *mem, **p;
struct in_addr addr;
if (status != ARES_SUCCESS) {
fprintf(stderr, "%s: %sn", (char*)arg,
ares_strerror(status, &mem));
ares_free_errmem(mem);
}
for (p = host->h_addr_list; *p; p++) {
memcpy(&addr, *p, sizeof(addr));
printf("%s: %sn", host->h_name, inet_ntoa(addr));
}
}
int main(int argc, char **argv)
{
ares_channel channel;
char *errmem;
int status, nfds;
fd_set read_fds, write_fds;
struct timeval *tvp, tv;
/* create/initialize a channel for DNS communications */
6. status = ares_init(&channel);
if (status != ARES_SUCCESS) {
fprintf(stderr, "ares_init: %sn",
ares_strerror(status, &errmem));
ares_free_errmem(errmem);
return 1;
}
/* for each command line arg */
for (argv++; *argv; argv++) {
/* look up the domain name */
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
}
/* wait for the queries to complete */
while (1) {
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
nfds = ares_fds(channel, &read_fds, &write_fds);
if (nfds == 0)
break;
tvp = ares_timeout(channel, NULL, &tv);
select(nfds, &read_fds, &write_fds, NULL, tvp);
/* calls the callback as appropriate */
ares_process(channel, &read_fds, &write_fds);
}
/* all done */
ares_destroy(channel);
return 0;
}
7. extension functions
Based on the C api, a nice convenient PHP alternative might look like this:
PHP version of ares resolving
<?php
function gothost($hostname, $status, $hostent)
{
if ($status != ARES_SUCCESS) {
echo "Failed to resolve $hostname: "
. ares_strerror($status) . "n";
return;
}
foreach ($hostent['addr_list'] as $ip) {
echo "$hostent[name] -> $ipn";
}
}
/* for each argument, resolve it */
function lookup_hosts()
{
$args = func_get_args();
$resolver = ares_init();
foreach ($args as $arg) {
ares_gethostbyname($resolver, $arg, 'gothost', $arg);
}
// wait up to 2 seconds for hosts to be resolved
while (ares_process_with_timeout($resolver, 2) > 0) {
// timed out (2 seconds are up)
// could do other stuff here while waiting
echo ".";
}
ares_destroy($resolver);
}
?>
We have arrived at a list of 5 functions that we need to implement in our
PHP extension:
• ares_init()
• ares_gethostbyname()
• ares_process_with_timeout()
• ares_destroy()
• ares_strerror()
Of these, ares_process_with_timeout() is special, as it wraps up a
number of bits and pieces that are difficult to bring into user space. Later,
we will look at plugging ares into stream_select(), but lets get this basic
step out of the way first.
8. ext_skel
Make sure you have these things ready:
• Latest PHP 4 source release
• ares headers and library
• Working build environment(!)
First thing to do is to generate an extension skeleton which will contain all
the stuff that PHP needs to be able to see your code.
generating a skeleton
% cd php4.3.x/ext
% ./ext_skel --extname=ares
ext_skel will produce output like this:
ext_skel output
Creating directory ares
Creating basic files: config.m4 .cvsignore ares.c php_ares.h CREDITS EXPERIMENTAL
tests/001.phpt ares.php [done].
To use your new extension, you will have to execute the following steps:
1. $ cd ..
2. $ vi ext/ares/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-ares
5. $ make
6. $ ./php -f ext/ares/ares.php
7. $ vi ext/ares/ares.c
8. $ make
Repeat steps 3-6 until you are satisfied with ext/ares/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
As it suggests, looking in the config.m4 file is the first thing we need to do -
we want configure to be able to find libares, so it is an essential step.
9. config.m4: the PHP build system
PHP has an excellent flexible build system. Each extension defines a
config.m4 containing shell script (and m4 macros) to help locate libraries
and headers that are required.
ext_skel has conveniently generated a template for us to use; all we need
to do is uncomment the parts that apply to our extension.
ares config.m4
dnl $Id$
dnl config.m4 for extension ares
PHP_ARG_WITH(ares, for ares support,
[ --with-ares Include ares support])
if test "$PHP_ARES" != "no"; then
# --with-ares -> check with-path
SEARCH_PATH="/usr/local /usr"
SEARCH_FOR="/include/ares.h"
if test -r $PHP_ARES/; then # path given as parameter
ARES_DIR=$PHP_ARES
else # search default path list
AC_MSG_CHECKING([for ares files in default path])
for i in $SEARCH_PATH ; do
if test -r $i/$SEARCH_FOR; then
ARES_DIR=$i
AC_MSG_RESULT(found in $i)
fi
done
fi
if test -z "$ARES_DIR"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Please reinstall the ares distribution])
fi
# --with-ares -> add include path
PHP_ADD_INCLUDE($ARES_DIR/include)
# --with-ares -> check for lib and symbol presence
LIBNAME=ares
LIBSYMBOL=ares_init
PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $ARES_DIR/lib, ARES_SHARED_LIBADD)
AC_DEFINE(HAVE_ARESLIB,1,[ ])
],[
AC_MSG_ERROR([wrong ares lib version or lib not found])
],[
-L$ARES_DIR/lib -lm
])
PHP_SUBST(ARES_SHARED_LIBADD)
PHP_NEW_EXTENSION(ares, ares.c, $ext_shared)
fi
10. Extension Anatomy 101
php_ares.h as generated by ext_skel
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2003 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: |
+----------------------------------------------------------------------+
$Id: header,v 1.10.8.1 2003/07/14 15:59:18 sniper Exp $
*/
#ifndef PHP_ARES_H
#define PHP_ARES_H
extern zend_module_entry ares_module_entry;
#define phpext_ares_ptr &ares_module_entry
#ifdef PHP_WIN32
#define PHP_ARES_API __declspec(dllexport)
#else
#define PHP_ARES_API
#endif
#ifdef ZTS
#include "TSRM.h"
#endif
PHP_MINIT_FUNCTION(ares);
PHP_MSHUTDOWN_FUNCTION(ares);
PHP_RINIT_FUNCTION(ares);
PHP_RSHUTDOWN_FUNCTION(ares);
PHP_MINFO_FUNCTION(ares);
PHP_FUNCTION(confirm_ares_compiled); /* For testing, remove later. */
/*
Declare any global variables you may need between the BEGIN
and END macros here:
ZEND_BEGIN_MODULE_GLOBALS(ares)
long global_value;
char *global_string;
ZEND_END_MODULE_GLOBALS(ares)
*/
/* In every utility function you add that needs to use variables
in php_ares_globals, call TSRM_FETCH(); after declaring other
variables used by that function, or better yet, pass in TSRMLS_CC
after the last function argument and declare your utility function
with TSRMLS_DC after the last declared argument. Always refer to
the globals in your function as ARES_G(variable). You are
encouraged to rename these macros something shorter, see
examples in any other php module directory.
*/
11. #ifdef ZTS
#define ARES_G(v) TSRMG(ares_globals_id, zend_ares_globals *, v)
#else
#define ARES_G(v) (ares_globals.v)
#endif
#endif /* PHP_ARES_H */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* indent-tabs-mode: t
* End:
*/
ares.c as generated by ext_skel
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2003 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: |
+----------------------------------------------------------------------+
$Id: header,v 1.10.8.1 2003/07/14 15:59:18 sniper Exp $
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_ares.h"
/* If you declare any globals in php_ares.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(ares)
*/
/* True global resources - no need for thread safety here */
static int le_ares;
/* {{{ ares_functions[]
*
* Every user visible function must have an entry in ares_functions[].
*/
function_entry ares_functions[] = {
PHP_FE(confirm_ares_compiled, NULL) /* For testing, remove later. */
{NULL, NULL, NULL} /* Must be the last line in ares_functions[] */
};
/* }}} */
/* {{{ ares_module_entry
*/
zend_module_entry ares_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"ares",
12. ares_functions,
PHP_MINIT(ares),
PHP_MSHUTDOWN(ares),
PHP_RINIT(ares), /* Replace with NULL if there's nothing to do at request
start */
PHP_RSHUTDOWN(ares), /* Replace with NULL if there's nothing to do at request end
*/
PHP_MINFO(ares),
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* Replace with version number for your extension */
#endif
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_ARES
ZEND_GET_MODULE(ares)
#endif
/* {{{ PHP_INI
*/
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("ares.global_value", "42", PHP_INI_ALL, OnUpdateInt,
global_value, zend_ares_globals, ares_globals)
STD_PHP_INI_ENTRY("ares.global_string", "foobar", PHP_INI_ALL, OnUpdateString,
global_string, zend_ares_globals, ares_globals)
PHP_INI_END()
*/
/* }}} */
/* {{{ php_ares_init_globals
*/
/* Uncomment this function if you have INI entries
static void php_ares_init_globals(zend_ares_globals *ares_globals)
{
ares_globals->global_value = 0;
ares_globals->global_string = NULL;
}
*/
/* }}} */
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(ares)
{
/* If you have INI entries, uncomment these lines
ZEND_INIT_MODULE_GLOBALS(ares, php_ares_init_globals, NULL);
REGISTER_INI_ENTRIES();
*/
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION(ares)
{
/* uncomment this line if you have INI entries
UNREGISTER_INI_ENTRIES();
*/
return SUCCESS;
}
/* }}} */
/* Remove if there's nothing to do at request start */
/* {{{ PHP_RINIT_FUNCTION
*/
PHP_RINIT_FUNCTION(ares)
{
return SUCCESS;
}
/* }}} */
/* Remove if there's nothing to do at request end */
13. /* {{{ PHP_RSHUTDOWN_FUNCTION
*/
PHP_RSHUTDOWN_FUNCTION(ares)
{
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION(ares)
{
php_info_print_table_start();
php_info_print_table_header(2, "ares support", "enabled");
php_info_print_table_end();
/* Remove comments if you have entries in php.ini
DISPLAY_INI_ENTRIES();
*/
}
/* }}} */
/* Remove the following function when you have succesfully modified config.m4
so that your module can be compiled into PHP, it exists only for testing
purposes. */
/* Every user-visible function in PHP should document itself in the source */
/* {{{ proto string confirm_ares_compiled(string arg)
Return a string to confirm that the module is compiled in */
PHP_FUNCTION(confirm_ares_compiled)
{
char *arg = NULL;
int arg_len, len;
char string[256];
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) ==
FAILURE) {
return;
}
len = sprintf(string, "Congratulations! You have successfully modified
ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "ares", arg);
RETURN_STRINGL(string, len, 1);
}
/* }}} */
/* The previous line is meant for vim and emacs, so it can correctly fold and
unfold functions in source code. See the corresponding marks just before
function definition, where the functions purpose is also documented. Please
follow this convention for the convenience of others editing your code.
*/
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
*/
14. ares_init - resources
The first function that we are going to implement is ares_init(). In the C
library, ares_init initializes a structure and then all other functions operate
on a pointer to that structure. Since we don't have structures and pointers
in PHP, we need to declare a resource type.
Resources are implemented in PHP using a global (per request) linked list
of resource identifiers. Each individual resource has associated with it:
• A resource "type" id
• A pointer value
In order to return a resource to the script, we will need to register a
resource type when our extension is loaded. We need to do this so that the
Zend Engine knows how to release the resource when the script
terminates - we register the resource with a destructor function.
registering a resource
/* True global resources - no need for thread safety here */
static int le_ares_channel;
static void ares_channel_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
/* TODO: rsrc->ptr need to be released correctly */
}
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MINIT_FUNCTION(ares)
{
le_ares_channel = zend_register_list_destructors_ex(ares_channel_dtor,
NULL, "ares channel", module_number);
return SUCCESS;
}
*/
Now we need to write the PHP function itself.
implementing ares_init()
/* {{{ proto resource ares_init()
Creates a DNS resolving communications channel */
PHP_FUNCTION(ares_init)
{
ares_channel channel;
int status;
status = ares_init(&channel);
if (status != ARES_SUCCESS) {
15. char *errmem;
ares_strerror(status, &errmem);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to init ares channel: %s",
errmem);
ares_free_errmem(errmem);
RETURN_NULL();
}
ZEND_REGISTER_RESOURCE(return_value, channel, le_ares_channel);
}
/* }}} */
• ares_channel is typedef'd as a pointer type
• If the channel couldn't be created, a regular php E_WARNING is
raised, and NULL is returned.
For the sake of completeness, lets implement ares_destroy() now too. It
demonstrates how to accept a resource type as a parameter.
ares_destroy()
/* {{{ proto void ares_destroy(resource $channel)
Destroys a DNS resolving channel */
PHP_FUNCTION(ares_destroy)
{
zval *r;
ares_channel channel;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"r", &r)) {
return;
}
ZEND_FETCH_RESOURCE(channel, ares_channel, &r, -1, "ares channel",
le_ares_channel);
zend_list_delete(Z_LVAL_P(r));
}
/* }}} */
• ZEND_FETCH_RESOURCE will automatically emit an error and return
from the function if the $channel parameter is not a valid channel
resource (eg: stream or image)
Almost done - now that we know how we are creating the channel, we
should fill in that dtor so it really does some work.
registering a resource
static void ares_channel_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
ares_channel channel = (ares_channel)rsrc->ptr;
ares_destroy(channel);
}
16. ares_gethostbyname()
Now we can write the real core of the extension - the resolver. We
decided that the API for the function would work like this:
function prototype for ares_gethostbyname
<?php
ares_gethostbyname($channel, $hostname, $callback, $callbackarg);
?>
So we need to write a PHP_FUNCTION that accepts a resource, a string,
and two generic zval values as parameters.
ares_gethostbyname() in C
/* {{{ proto void ares_gethostbyname(resource $channel, string $hostname, mixed
$callback, mixed $arg)
Initiate resolution of $hostname; will call $callback with $arg when complete */
PHP_FUNCTION(ares_gethostbyname)
{
zval *zchannel, *zcallback, *zarg;
char *hostname;
long hostname_len;
ares_channel channel;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rszz",
&zchannel, &hostname, &hostname_len, &zcallback, &zarg)) {
return;
}
ZEND_FETCH_RESOURCE(channel, ares_channel, &zchannel, -1, "ares channel",
le_ares_channel);
/* more code to go here ... */
}
/* }}} */
Now, we've hit a little bit of a hurdle - we need to call back into the engine
when the resolution completes. There is a little bit of magic required, since
we can't call a PHP_FUNCTION directly from C (well, we can, but we can't
call it directly from this callback). We need to define a structure to hold the
function name (or object + method name) of the callback, as well as the
argument. We'll pass those to ares and have a little stub C function to act
as the real callback:
structure and callback for gethostbyname
struct php_ares_callback_struct {
zval *callback;
zval *arg;
};
static void php_ares_hostcallback(void *arg, int status, struct hostent *host)
17. {
struct php_ares_callback_struct *cb = (struct php_ares_callback_struct *)arg;
/* TODO: map hostent to php and call the callback */
}
Let's jump back to the gethostbyname function and fill in the callback
structure:
ares_gethostbyname() continued
/* {{{ proto void ares_gethostbyname(resource $channel, string $hostname, mixed
$callback, mixed $arg)
Initiate resolution of $hostname; will call $callback with $arg when complete */
PHP_FUNCTION(ares_gethostbyname)
{
zval *zchannel, *zcallback, *zarg;
char *hostname, *callback_name;
long hostname_len;
ares_channel channel;
struct php_ares_callback_struct *cb;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rszz",
&zchannel, &hostname, &hostname_len, &zcallback, &zarg)) {
return;
}
ZEND_FETCH_RESOURCE(channel, ares_channel, &zchannel, -1, "ares channel",
le_ares_channel);
/* verify that the callback will work */
if (!zend_is_callable(zcallback, 0, &callback_name)) {
php_error_docref1(NULL TSRMLS_CC, callback_name, E_WARNING,
"3rd argument is not a valid callback");
efree(callback_name);
return;
}
/* copy the values into the structure */
cb = (struct php_ares_callback_struct*)emalloc(sizeof(*cb));
MAKE_STD_ZVAL(cb->callback);
*cb->callback = *zcallback;
zval_copy_ctor(*cb->callback);
MAKE_STD_ZVAL(cb->arg);
*cb->arg = *zarg;
zval_copy_ctor(*cb->arg);
ares_get_hostbyname(channel, hostname, AF_INET,
php_ares_hostcallback, cb);
}
/* }}} */
We can come back to the callback now - we have another little problem -
we can't pass a struct hostent directly to a script, so we need to copy the
data from it into a zval that can be passed. Looking back at our API
sample, we chose to use an array with keys named similarly to the C
structure:
the sample PHP version of the callback
<?php
function gothost($hostname, $status, $hostent)
{
18. if ($status != ARES_SUCCESS) {
echo "Failed to resolve $hostname: "
. ares_strerror($status) . "n";
return;
}
foreach ($hostent['addr_list'] as $ip) {
echo "$hostent[name] -> $ipn";
}
}
?>
So the task is now to create an array and set it up as follows:
layout of the hostent parameter
<?php
$hostent = array();
$hostent['name'] = $hostname;
$hostent['addr_list'] = array();
$hostent['addr_list'][] = $ip1;
?>
The C translation of that code looks like this:
building a hostent array in C
static void php_ares_hostcallback(void *arg, int status, struct hostent *host)
{
struct php_ares_callback_struct *cb = (struct php_ares_callback_struct *)arg;
struct in_addr addr;
char **p;
zval *hearray, *addr_list;
MAKE_STD_ZVAL(hearray);
array_init(hearray);
add_assoc_string(hearray, "name", host->h_name, 1);
MAKE_STD_ZVAL(addr_list);
array_init(addr_list);
for (p = host->h_addr_list; *p; p++) {
memcpy(&addr, *p, sizeof(addr));
add_next_index_string(addr_list, inet_ntoa(addr), 1);
}
add_assoc_zval(hearray, "addr_list", addr_list);
}
Now we get to the most important part - calling the callback.
using call_user_function to call the callback
static void php_ares_hostcallback(void *arg, int status, struct hostent *host)
{
zval retval;
zval *arguments[3];
struct php_ares_callback_struct *cb = (struct php_ares_callback_struct *)arg;
/* insert code for mapping the hostent to an array (from above) here */
arguments[0] = cb->arg;
MAKE_STD_ZVAL(arguments[1]);
ZVAL_LONG(arguments[1], status);
19. arguments[1] = hearray;
if (call_user_function(EG(function_table), NULL,
cb->callback, &retval, 3, arguments TSRMLS_CC) == SUCCESS) {
/* release any returned zval - it's not important to us */
zval_dtor(&retval);
}
FREE_ZVAL(arguments[1]);
/* and clean up the structure */
zval_dtor(cb->callback);
zval_dtor(cb->arg);
zval_dtor(hearray);
efree(cb);
}
20. ares_process_with_timeout
This function provides the easy way to check on the status of the DNS
resolution, and call the callbacks if it has completed. For convenience we
can specify a timeout so we can "sleep" on it while waiting.
Lets take a look at the fragment of code from the ahost example again:
fragment from ahost
int main(int argc, char **argv)
{
ares_channel channel;
int status, nfds;
fd_set read_fds, write_fds;
struct timeval *tvp, tv;
/* ... */
/* wait for the queries to complete */
while (1) {
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
nfds = ares_fds(channel, &read_fds, &write_fds);
if (nfds == 0)
break;
tvp = ares_timeout(channel, NULL, &tv);
select(nfds, &read_fds, &write_fds, NULL, tvp);
/* calls the callback as appropriate */
ares_process(channel, &read_fds, &write_fds);
}
/* ... */
}
We'll do things a little differently - we will be specifying our own timeout.
implementing the function
/* {{{ proto long ares_process_with_timeout(resource $channel, long $secs)
check for completion of DNS resolution and call callbacks. Returns number of
outstanding requests. */
PHP_FUNCTION(ares_process_with_timeout)
{
zval *zchannel;
ares_channel channel;
long timeout_secs;
struct timeval tv;
int status, nfds;
fd_set read_fds, write_fds;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl",
&zchannel, &timeout_secs)) {
return;
}
ZEND_FETCH_RESOURCE(channel, ares_channel, &zchannel, -1, "ares channel",
le_ares_channel);
FD_ZERO(&read_fds);
22. Nice things for error handling
If the DNS resolution fails for some reason, we might want to notify the
user of the error message, or we might want to act upon the error code
and take some alternative course of action. To do these things we need to
have a function to retrieve the error message text, and it would also be
nice to have some symbolic constants to descirbe the error codes.
implementing ares_strerror
/* {{{ proto string ares_strerror(long $statuscode)
returns a string description for an error code */
PHP_FUNCTION(ares_strerror)
{
long statuscode;
char *errmem = NULL;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",
&statuscode)) {
return;
}
ares_strerror(status, &errmem);
RETVAL_STRING(return_value, errmem, 1);
ares_free_errmem(errmem);
}
/* }}} */
The other nice thing to have is symbolic constants. We can do the
equivalent of define() when our extension is loaded. We do this in our
module init (MINIT) function, just after the point where we register our
resource type.
error codes defined by libares
#define ARES_SUCCESS 0
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
#define ARES_ENODATA 1
#define ARES_EFORMERR 2
#define ARES_ESERVFAIL 3
#define ARES_ENOTFOUND 4
#define ARES_ENOTIMP 5
#define ARES_EREFUSED 6
/* Locally generated error codes */
#define ARES_EBADQUERY 7
#define ARES_EBADNAME 8
#define ARES_EBADFAMILY 9
#define ARES_EBADRESP 10
#define ARES_ECONNREFUSED 11
#define ARES_ETIMEOUT 12
#define ARES_EOF 13
#define ARES_EFILE 14
#define ARES_ENOMEM 15
#define ARES_EDESTRUCTION 16
23. To map these into user space:
registering a resource
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MINIT_FUNCTION(ares)
{
le_ares_channel = zend_register_list_destructors_ex(ares_channel_dtor,
NULL, "ares channel", module_number);
REGISTER_LONG_CONSTANT("ARES_SUCCESS", ARES_SUCCESS, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ARES_ENODATA", ARES_ENODATA, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ARES_EFORMERR", ARES_EFORMERR, CONST_CS|CONST_PERSISTENT);
/* ... */
return SUCCESS;
}
*/
24. Summary
We can now make asynchronous DNS resolution requests, and even run
them concurrently. Along the way we have learned about the major parts
of writing a PHP extension:
• config.m4
• general structure
• PHP_FUNCTION
• zend_parse_parameters
• making callbacks
• registering resources
• registering constants
• returning values to the script
how to use with stream_select()
<?php
$s1 = fsockopen($host1, $port);
$s2 = fsockopen($host2, $port);
$chan = ares_init();
ares_gethostbyname($chan, 'sample.com', 'sample.com');
/* wait for things to come back */
while (true) {
/* don't wait for anything - return immediately */
ares_process_with_timeout($chan, 0);
/* wait 5 seconds for data on the sockets */
$r = array($s1, $s2);
$n = stream_select($r, $w = null, $e = null, 5);
if ($n) {
/* do something with it */
}
}
?>