Introduction: Reversible Cellular Automata
The program simulates reversible 2-state block celular automata with Margolus neighbourhood.
WikipediaA block cellular automaton consists of the following components:
- A regular lattice of cells
- A finite set of the states that each cell may be in
- A partition of the cells into a uniform tessellation in which each tile of the partition has the same size and shape
- A rule for shifting the partition after each time step
- A transition rule, a function that takes as input an assignment of states for the cells in a single tile and produces as output another assignment of states for the same cells.
The simplest partitioning scheme is probably the Margolus neighborhood, named after Norman Margolus, who first studied block cellular automata using this neighborhood structure. In the Margolus neighborhood, the lattice is divided into 2-cell blocks (or 2 × 2 squares in two dimensions, or 2 × 2 × 2 cubes in three dimensions, etc.) which are shifted by one cell (along each dimension) on alternate timesteps.
The field
The field of the simulator is a rectangular lattice of cells, where each cell can be either dead or alive. The field is toroidal, that is: opposite edges of the field are “glued” together. In the Margolus neighborhood, the lattice is divided into square blocks 2×2 cells. There are 2 partitioning schemes: in one scheme, top-left corner of each block has even coordinates, and in the another both coordinates are odd. These 2 schemes are alternated on each generation, first scheme is applied to the even generations, and second to the odd ones. Consequently, complete state of the field must also include the phase which is the oddity of the current generation.
Rules
Transition rule encoding
The transition rule is a function that calculated the next state of a block from the current state. For a cellular automaton to be reversible, such function should, indeed, be invertible.
Since in the Margolus neighborhood block consists of 4 cells and there are 2 possible cell states, 24 = 16 possible blocks exist:
0 1 2 ... 15
...
A transition rule must assign a descendant state for each of the 16 original states. If the rule is invertible, this correspondence must be a one-to-one relation; in other words - it must be a permutation of 16 elements. In the simulator, rules are represented as arrays of 16 integers from 0 to 15.
For example, (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) is the identity rule that does not changes any cells. The cellular automaton with this rule is rather boring though: in this rule, any pattern remains unchanged forever. This rule is, indeed, reversible.
More interesting example is the rule called “Billiard Ball Machine”. It is described by the permutation: (0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15). It is hard see from the numbers themselves, but this automaton exhibits behavior, resembling bouncing billiard balls and walls:
Rule invariants
Contrary to the well-known Conway's Life cellular automaton, block automata with Margolus neighborhood has no (1,0) and (0,1) translation symmetry. This means that shift by 1 cell (or any other odd number of them) turns a pattern into completely different one. Only translation by a whole block (2 cells) in any direction leaves behavior of a pattern unchanged - it is guaranteed by construction. For example, in the “Critters” the top pattern is a spaceship, and the bottom is an oscillator.
Rules may have other invariants. The application performs analysis of a rule to determine them. The following invariants are detected:
- Rotate by 90°
- The rule has 4-fold rotational symmetry; transition function commutes with rotation by 90°. For example, spaceship rotated by 90° will remain spaceship but change travel direction.
- Rotate by 180°
- The rule has 2-fold rotational symmetry; transition function commutes with rotation by 180°. 4-fold symmetry implies 2-fold too, but converse is not true. If a rule only have 2-fold symmetry, then spaceships in this rule
- Horizontal / Vertical / Diagonal flip
- The rule has mirror symmetry with axis, oriented horizontally, vertically or diagonally. The “Critters” rule has mirror symmetry; mirrored pattern will evolve in the same way as original. The “Rotations” rule (0,2,8,12,1,10,9,11,4,6,5,14,3,7,13,15) has no such symmetry. For example:
- Negation
- In the rules with negation symmetry, evolution of the pattern will be the same, if every alive cell is replaced with dead and back. The “Rotations” rule is negation-invariant.
Conservation law
Regarding the total number of alive cells in the field, 3 different kind of behavior can be observed:
- Number of alive cells varies.
“Tron” rule, (15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0) is an example of such behavior. Usually, almost any initial pattern tends to grow chaotically in such automata. Numbers of dead and alive cells tending to become nearly equal. Often, resulting pattern is visually indistinguishable from the random noise, though the “Tron” rule is a counter-example. - Number of alive cells is constant.
“Billiard Ball Machine” rule is an example. - “Flashing” rules, where numbers of alive and dead cells are interchanging on each generation.
After 2 generations, number of alive cells returns to the original value, so it can be considered as a special case of the previous type.
The “Critters” rule is an example.
Dual transform
Time-inverted block cellular automaton is also block cellular automaton of the same kind. Its rule is inverse permutation of the original rule. However, there is one more difference: in time-inverted cellular automata, order of phases of the lattice is also inverted. This can be obtained by translating whole field by 1 cell along both axes. In the simulator program, this is called phase shift; buffer content can be phase-shifted with button .
In a general case, the inverse rule is completely different from the direct. But for some rules, a simple geometrical relation between direct and inverse rules is present. For example, in the “Rotations” rule (0,2,8,12,1,10,9,11,4,6,5,14,3,7,13,15) inverse rule is a mirror image of the direct. In other words, to inverse-transform a pattern, one could first mirror it, then transform it directly, and finally mirror it again. It can be written down as:
If dual transform exists for a rule, then for every pattern it is possible to construct a dual pattern that evolved back in time. It can be constructed in following 2 steps:
- apply dual transform to the pattern,
- offset transformed pattern by the vector (1,1) (“phase shift”).
For some rules, dual transform is identity. I call such rules self-dual, example is the “Critters” rule. In such rules, it is enough to phase-shift a pattern to construct its dual.
Rule vacuum period
Number of generations, after which empty field (vacuum) returns to its original state. For the population-preserving rules, vacuum period is 1; for the “flashing” rules it is 2. Some irregular rules can have bigger vacuum periods. For example, asymmetric rule (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0) has vacuum period of 7.
Predefined Rules
The simulator contains a set of predefined rules, taken from the MCells page.
Here are they:
Name Rule Description
BBM 0,8,4,3,2,5,9,7,1,6,10,11,12,13,14,15 Famous Billiard Ball Machine - from Cellular Automata Machines. A rule by Edward Fredkin. Bounce Gas 0,8,4,3,2,5,9,14,1,6,10,13,12,11,7,15 An uniform “gas”. A rule by Tim Tyler. Bounce Gas II 0,8,4,12,2,10,9,7,1,6,5,11,3,13,14,15 Another uniform “gas”. A rule by Tim Tyler. Critters 15,14,13,3,11,5,6,1,7,9,10,2,12,4,8,0 This rule supports “gliders” - as described in Cellular Automata Machines. A rule by Margolus/Toffoli. HPP Gas 0,8,4,12,2,10,9,14,1,6,5,13,3,11,7,15 HPP (Hardy/Pazzis/Pomeau) lattice gas - as described in Cellular Automata Machines. A rule by Hardy, Pazzis, and Pomeau. Rotations 0,2,8,12,1,10,9,11,4,6,5,14,3,7,13,15 Limited diffusion. A rule by Tim Tyler. Rotations II 0,2,8,12,1,10,9,13,4,6,5,7,3,14,11,15 Limited diffusion. A rule by Tim Tyler. Rotations III 0,4,1,10,8,3,9,11,2,6,12,14,5,7,13,15 Slow, random-looking diffusion. A rule by Tim Tyler. Rotations IV 0,4,1,12,8,10,6,14,2,9,5,13,3,11,7,15 Slow, random-looking diffusion. A rule by Tim Tyler. Sand 0,4,8,12,4,12,12,13,8,12,12,14,12,13,14,15 Sand simulation. Non-revertible. A rule by Mirek Wojtowicz. String Thing 0,1,2,12,4,10,9,7,8,6,5,11,3,13,14,15 String shaped patterns. A rule by Tim Tyler. String Thing II 0,1,2,12,4,10,6,7,8,9,5,11,3,13,14,15 More string shaped patterns. A rule by Tim Tyler. Swap On Diag 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 A gas with no particle interactions - as described in Cellular Automata Machines. A rule by Margolus/Toffoli. Tron 0,15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0 A “trip-a-tron” - from the pages of Cellular Automata Machines. A rule by Margolus/Toffoli.
RLE encoding
For textual representation of the patterns, the simplified RLE format is used. RLE string consists of decimal numbers and characters “b”, “o” and “$”, designating dead cell, alive cell and new line correspondingly. Decimal numbers designate repeat count of the next character. See details here. Only “b” (dead cell), “o” (alive cell) and “$” (newline) characters and digits are supported; space characters are ignored. Example: Comments, offset and other features of RLE are not supported.
Features
Pattern analyzer
Some rules (such as Rotations, Rotations II, III, IV) support spaceships and oscillators with extremely large periods. For example, The following spaceship in the “Rotations II” rule (0,2,8,12,1,10,9,13,4,6,5,7,3,14,11,15) has period 10896 generations. Manual classification of such patterns is nearly impossible. To simplify this task, the simulator has the pattern analyser feature, enabled by the button. To use it, select some area on the field and then press the button. Application will try to detect the following information:
- Type of the pattern: oscillator, diagonal, orthogonal or slant spaceship.
- Period (for the spaceships and oscillators).
- Offset (for the spaceships): how far the spaceship travels per one period.
- Canonical form of the pattern: the most “compact” of all evolution steps of the pattern. Sometimes it is not unique.
Spaceship Catcher
Enabled by the button:
. Spaceship catcher is a tool that automatically :- finds all patterns touching the borders of the field,
- removes them from the field,
- analyses and adds canonical form to the current library.
GIF Recorder
The application can record GIF animations. To start record, press the
. This will start the recorder. Then let the field evolve for several generations, using play buttons. Each new frame will be added to the GIF image. You will see, how the size of the file in Kb grows. To stop record and get the produced image, press the button. Image can be saved using right-click.Patterns Library
The simulator support simple management of pattern libraries: catalogs of patterns. Libraries are stored in the Local Storage of the browser, and will remain there even after restart of the browser. To move library between browsers, or to analyze library data with another application, JSON import/export feature is available.


Nishok Mohan
Senior Software Engineer @ Shutterstock
Nishok Mohan
Senior Software Engineer @ Shutterstock
- A Senior Software Engineer at Shutterstock with over 10 years of experience in various software development Agile roles.
- Currently, working as a senior developer in Shutterstock, developing scalable platforms for account creation, product creation, purchases & fulfillment, licensing & downloading earnings & payouts, and other commerce-related customer interactions.
- Architected and developed Network operating system for Distributed/Cloud native Software Defined Networks. Designed and developed Path computation engine for complicated and disaggregated layered Optical networks.
- Exceptional problem solving and analytical skills, and research and development skills.
- Experience in leading a software project through the complete development and quality assurance lifecycle.
- Excellent interpersonal and communication skills.
- Hard-working and detail-oriented with the ability to articulate and resolve a complex technical matter
Nishok Mohan
Download Full CV
Nishok.N.M
<EMAIL_ADDRESS>LinkedIn Profile
@GitHub
GitHub Profile
Work Experience
-
Senior Software Engineer
Jan 2022 - PresentShutterstock, New York, USA - Remote
- Senior developer in Shutterstock, developing scalable platforms for account creation, product creation, purchases & fulfillment, licensing & downloading earnings & payouts, and other commerce-related customer interactions.
-
Full Stack Senior Software Developer / Research Scientist 2
Nov 2019 - Nov 2021Bell Labs, Nokia, Kanata, Ottawa, CA & Minneapolis, MN, USA
- Architecting and developing distributed cloud native End to End Path computation engine for complicated and disaggregated layered Optical networks. This engine not only implements advanced graph data structures and algorithms such as Dijkstra, BellmanFord, Floyd Warshall, Suurballe, Bhandari but also constructs scalable optimized Topology graph for millions of network elements using Docker, Kubernetes, Reactor Java and Neo4j Graph database, following ONF TAPI standards. This application uses JAVA 11 concurrency model for Parallel algorithm execution.
- Developed Automated Test container-based integration testing for Neo4j database Framework for IP/Optical Network Topology.
- Architecting and developing Health and Analytics Streaming system for proactive service failure detection. The health data from IP/Optical devices will be in the order of 100s of thousands per second. Designed and developed Kafka based streaming analytics for data monitoring and collection. This distributed highly scalable architecture was developed using Reactor Java, Kafka Queues and Streaming framework, gNMI (gRPC Network Management Interface) and Angular elements. This framework also adapts CQRS (Command Query Responsibility segregation), Event sourcing and ORM (Object Relation Mapping) techniques.
- Developed scalable distributed Network Slicing service across IP, optical layers which supports IP-Prefixing and VLAN. The slicing framework was developed using Angular.js, Node.js and Java Springboot.
- Team lead of 4 engineers for Lab infrastructure development Team, architecting and managing several clusters of cloud infrastructure such as VMware cloud, Openstack (CBIS, NCIR), Kubernetes (NCM, BCMT) etc. The Lab dashboard was developed using Angular.js, vanilla javascript and Node.js
Publications
- Nishok N.Mohanasamy, N. Choi, L. Jagadeesan, Muntasir R.Rahman, Y. J. Kim, K. Sabnani, M. Thottan, “Run-time Performance Monitoring, Verification, and Healing of End-to-End Services”, IEEE PVE-SDN 2019
-
Full Stack Senior Software Developer / Research Scientist
Feb 2017 - Nov 2019Bell Labs, Nokia, MH, New Jersey
- Principal architect for NetUNIX Network Operating system, SDN programmable operating system for network elements across all layers such as IP, Optics, WIFI, LTE and other mobile networks. Developed using Java, Angular2 (Javascript), HTML5, CSS3 frameworks, D3.js and OSGi Karaf which is compatible with ONOS.
- Architected and deployed OpenStack (Queens/Rocky, CBIS, NCIR) Data center cloud with Nokia airframes (RM and OR) with spine-leaf switches. Designed Openstack cloud with SDN OVS support and Ceph storage mechanism.
- Responsible for developing, maintaining and releasing of NetUNIX software distribution for team collaboration using Continuous Integration packages such as GITLab, Dockers, raw VMs, JFrog repository management system (artifactory), and Maven/ BUCK framework for artifact publishing.
- Designed and implemented Network Slicing framework across IP, optical layers which supports IP-Prefixing and VLAN. Developed using Java, Angular2 and OSGi Karaf.
- Responsible for setting up Telco Cloud using VMware Hypervisor ESXi and vCloud using nearly 50 Airframe Blades (bare metal) each having 48 cores, 256 GB RAM and around 6TB memory, around 3 TOR switches with 48 10G SFP+. Also, deployed this cloud using vSAN datastores.
- Architected and deployed OpenStack cloud with airframe blades and TOR switches. Designed Openstack cloud with SDN OVS support and Ceph storage mechanism.
- Developed FICO dashboard, visualization for Failure Injection COmpiler, using Node.js, HTML5 and Angular2.
- Designed a private webpage for NetUNIX using Joomla, php, mariaDB (mysql) and published using NAS (synology) web station.
- Developed 'Verification Transverse Middle Box' which records the INT (In-Bound Telemetry) of P4 switches and schedules the event messaging to verification engine subscriber. Designed using python, Django, swagger REST and BPF Collector.
Publications
- Y. J. Kim, J. E. Simsarian, N. Choi, Nishok N. Mohanasamy, M. Thottan, " Cross-layer Aware Packet- Optical Link Management in Software-Defined Network Operating System", Optical Networking and Communication Conference & Exhibition (OFC), March 2018.
- J. E. Simsarian, Y. J. Kim, N. Choi, C. D. Martino, Nishok N.Mohanasamy, P. J. Winzer, M. Thottan, "Error Awareness in a Multi-Layer Transport Network OS", OSA Journal of Optical Communication and Networking, 2018.
- M. Thottan, C. Di Martino, Y-J. Kim, G. Atkinson, N. Choi, N. Mohanasamy, L. Jagadeesan, V. Mendiratta, J. Simsarian, and B. Kozicki, The Network OS: Carrier-grade SDN control of multi-domain, multi-layer networks in Bell Labs Technical Journal, vol. 21, pp.1-29, 2017.
- C. D. Martino, M. Thottan, Nishok N.Mohanasamy, Stefano Russo, Ugo Giordano “In Production Performance Testing of SDN Control Plane for Telecom Operators”, DSN 2018
-
Nokia Bell Labs R&D Intern
June 2016 - Decemeber 2016Bell Labs, Nokia, MH, New Jersey
- Architected and developed Element Management system primarily for Nokia Optical Network elements such as 1830PSS 7750SR using Java, Angular2 and SAM-O (Proprietary SOAP implementation), Tomcat application server and exposed North-bound APIs using swagger REST. This framework also supports multi-vendor/ multi-technology network elements.
- Architected and developed Network Resource Manager for SDN network optimization using constraints such as Bandwidth, Latency etc. The framework was developed using Java, Angular2 and OSGi Karaf.
- Designed and developed visualization frameworks using MEAN stack (Node.js, MongoDB), couchDB, HTML5, CSS3, Spring Boot and SVGs for MWC (Mobile World Congress) at Barcelona and GLT at Sunnyvale during the year 2015 and 2016 respectively.
- Developed a visual impairment injector framework for injecting failures such as BIT error rate for optical devices using Java, HTML5, D3.js OSGi, Karaf, and Angular2.
-
Graduate Assistant
Sep 2015 - June 2016Montclair State University, New Jersey
- Research assistant for Machine Learning in Censorship predictions.
- Developed a donation application where the donors can monitor the progress of the donations using Android, NodeJS and MongoDB.
- Developed an image-based user authentication system using HTML5, Javascript, Node.js and MongoDB.
- Developed a real-time parking application, providing real-time navigation to the closest parking space available using Node.js, MongoDB and jQuery.
- Developed a unified and secure administration system for college purposes, where any type of users such as student, professor, administrator, payroll or any other professional related to college can view and update information that is meant only for him/her, using Android SDK and Core Java.
- Developed a Conference website, which hosts the paper presentation and other events, using php and Node.js.
- Assisting Undergrad students for Programming, Data Structure, and other computer science related assignments and Projects.
- Assisting Professors in Organizing course work on canvas, in grading the students on canvas and in labs as TA.
-
Senior Software Enginner /
Jan 2014 – Aug 2015
User Interface EngineerOpenText Corp., India
- Worked as team lead, scrum master and front-end engineer, not only developing user interfaces and implementing back-end javascripting but also managing the team with several sprints, and achieved quality assurance through continuous integration.
- Designed and developed a Tree-Grid Library, a table composite control, having an extra tree column, which is used to render data from multiple tables using Primary/Foreign relations RDMS, and tailored for Cordys BOP software using Java, CORDYS xforms (inhouse vanilla Javascript frameworks).
- Integrated XForm loading (.cafs) into Process Platform's Entity Model runtime using HTML5, Backbone.js, Underscore.js, Marionette.js and JQuery.
- Developed Pathfinder, which derives a matrix of relations between source code and test cases. Pathfinder was developed using Cordys BOP itself and Java and crawls on both Java and Javascript code base.
-
Software Enginner
July 2009 - Dec 2013Cordys R&D, India
- Worked as Software Engineer in Cordys R&D for 4 years, involving full life-cycle product development and quality assurance. Addressed several enhancements and bugs in Workflow component, middle layered team in SOA which provides task communication with details to users groups such as developer, tester, manager and more or users in the form of INBOX similar to that of GMAIL’s Inbox with lots of runtime functionalities.
- Developed selenium Framework based on the complicated DOM structure of CORDYS BOP where testers can write test cases comfortably using Core Java.
- Architected distributed micro-service Workflow component, a middle-layered component in SOA which provides task communication with details to user’s groups such as developer, tester, manager and more or users in the form of INBOX similar to that of GMAIL’s Inbox with lots of runtime functionalities
Education
-
MS in Computer Science
Sep 2015 - Dec 2016Montclair State University, New Jersey
- GPA : 3.94/4
Publications
- Nishok Narasimha-Mohanasamy, John Jenq, An Intelligent Parking Assistant, Proceedings of The 20th World Multi-Conference on Systemics, Cybernetics and Informatics (WMSCI 2016).
-
BE in Computer Science Engineering
Aug 2005 - May 2009Anna University, India
- First Class with Distinction
- GPA : 3.74/4


70 surveys were realized to people of the school alberto lleras camargo (school of santiago) and of the school the toscana (of viviana). To collect the analysis of these, we could know that most of the people if they want that the proyect is realize or not . At the moment of answering some people were more creative than others; someone put that the seeds can serve for food for birds, gastronomy, between other things. It is very important to analyze that many individuals provided very good ideas, which is good because it can be a contribution too large to the project
Article by Juan Jose Arroyo .


rosetta-stone
Businessmodel of Rosetta Stone
Customer Segments
Rosetta Stone offers language and reading software solutions to commercial and institutional clients, as well as to general consumers. The Company’s customers can be organised into the following core categories:
- Consumers, comprising general consumers and language learners around the world;
- Corporations, comprising commercial entities across multiple business sectors, including the financial services, energy, retail, and healthcare industries;
- Educational Institutions, including schools and higher education institutions from K-12 through to college and university; and
- Government and Non-Profit Institutions, including municipal, state, and federal government bodies, public agencies and organisations, and not-for-profit institutions. Rosetta Stone provides solutions to a number of high-profile companies, including Royal Dutch Shell, Kimberly Clark, and Best Buy.
Rosetta Stone serves a global client base, including customers across the Americas, Europe, Asia Pacific, the Middle East, and Africa.
Value Propositions
Rosetta Stone provides value to its customers in the following ways:
- Its brand strength and reputation, with the Company established the most well-known brand in language learning around the world, having a positive track record dating back a number of years, and serving a range of high-profile clients;
- Its broad range of products and services, with the Company offering courses in more than 30 languages for consumers, as well as language learning solutions that are designed specifically for businesses and educators;
- Its accessibility and ease of use, with the Company offering its courses across multiple channels that can be accessed online or through onsite software, including web-based software subscriptions, digital downloads, mobile applications, and compact disc packages;
- Its proprietary technologies and platform, with the Company utilising a range of proprietary technologies and intellectual properties in the development and delivery of its language learning programs, making its offerings unique within the industry; and
- Its industry expertise and experience, with the Company employing specialist linguistic and technical personnel across its two operating segments, to ensure that its solutions are accurate, reliable, and efficient. ### Channels
Rosetta Stone operates a website at www.rosettastone.com, through which it provides information on its various consumer, corporate, and educational solutions, as well as its various available languages.
Rosetta Stone operates an online sales channel that allows customers to purchase and download learning resources or pay for online subscriptions directly from its website. The Company’s products are delivered across multiple channels, including online software subscriptions, digital software downloads, mobile applications, and compact disc packages.
The Company also sells products to consumers via call centre operations, third party ecommerce websites, retail partners – including Amazon Barnes and Noble, Target, and Best buy – and daily deal partners.
Rosetta Stone makes the bulk of its sales to institutions and corporations through its direct sales force that is organised by geographic region. The Company’s sales personnel operate out of its network of offices across its operating regions. Rosetta Stone also utilises the services of third party resellers and distributors to reach corporate and institutional clients around the world.
Customer Relationships
Rosetta Stone sells its products in various forms to consumers on a self-service basis, with customers able to download software, subscribe to online services, and purchase physical compact disc sets directly form the Company’s website. Customers can also download the Company’s mobile apps directly from the Apple App Store and Google Play Store, and can access the Company’s online portal independently without interact with sales and service personnel.
Rosetta Stone offers a more personalised service through its call centre and directs sales teams, who consult closely with customers, in particular corporate and institutional clients, in order to fully establish their requirements and circumstances. The Company is able to scale and tailor its offerings in many cases, and seeks to establish longstanding relationship through high-quality customer service.
Rosetta Stone offers ongoing support to its consumer and commercial customers, who are able to interact directly with dedicated customer support personnel over the phone, via an online contact form, or through a live online chat service. The Company also offers a range of support resources, including FAQs, installation and user guides, and payment guides.
Rosetta Stone maintains a social media presence across several networks – including Twitter, Facebook, Google+, and YouTube – through which its able to public company updates and interact directly with customers.
Key Activities
Rosetta Stone offers a range of personalised language and reading programs for consumers, corporations, government bodies, and non-profit institutions.
The Company aligns its operations into reportable business segments: Enterprise and Education, which derives revenue from the sale of language learning products and solutions to educational institutions, corporations and government agencies around the world; and Consumer, which derives revenue from the sale of similar language learning courses to individual consumers and retail partners. Rosetta Stone delivers its course across multiple channels, including cloud-based online platforms, digital software downloads, mobile applications, and physical product sales.
The Company serves a global client base, including commercial and consumer customer base across the Americas, Asia Pacific, Europe, the Middle East, and Africa.
Key Partners
Rosetta Stone works closely with a network of partner companies and organisations across its two operating segments. These partners can be organise broadly into the following categories:
- Supplier and Vendor Partners, comprising suppliers of services, equipment, tools, and resources that the Company utilises in support of its core software development and delivery operations;
- Channel and Distribution Partners, comprising the Company’s extensive network of retail partners, third party resellers, distributors, marketing affiliates, and independent sales agents that assist in extending the reach of the Company’s in-house sales force;
- Technology and Development Partners, comprising software developers, IT service providers, technology companies, and platform-as-a-service providers with which the Company collaborates on joint offerings and which support the development and maintenance of the Company’s solutions; and
- Strategic and Alliance Partners, comprising market leading companies across multiple business sectors with which the Company collaborates on joint projects, including in branding, marketing, and development. Rosetta Stone has a number of key partnerships in place. This includes a strategic partnership with online language learning platform LiveMocha, reseller partnerships with BME, Creative Tech, and Mattar Consulting, and high-profile retail partners such as Amazon, Target, and Best Buy.
Key Resources
Rosetta Stone’s key resources are its technologies and intellectual properties, its software products and online platform, its IT and communications infrastructure, its sales and distribution channels, its partnerships, and its personnel.
Rosetta Stone owns and utilises various proprietary technologies that are key in the development of its software products and platform. A search of records published by the US Patent and Trademark Office identified a number of patent applications filed in Rosetta Stone’s name, as both applicant and assignee, including applications entitled ‘Method and system for reading fluency training’, ‘Performing a computerized language teaching lesson using a main computer and a mobile device’ and ‘System and method for teaching non-lexical speech effects’.
Rosetta Stone owns and or leases various corporate office locations around the world, as well as call centre locations.
Cost Structure
Rosetta Stone incurs costs in relation to the development of its technologies and software solutions, the development and maintenance of its online platform, the maintenance of its IT and communications infrastructure, the procurement of services, the operation of its sales and call centre operations, the management of its partnerships, the implementation of advertising and marketing campaigns, and the retention of its personnel.
In 2015 Rosetta Stone recorded total operating costs in the amount $222.96 million. This included sales and marketing expenses in the amount of $136.08 million, research and development costs in the amount of $29.94 million, and general and administrative costs in the amount of $50.12 million.
Revenue Streams
Rosetta Stone generates revenue through the development and sale of various language learning and reading products and solutions. The Company derives revenue in the form of physical and digital sales, subscription fees, and service contracts.
In 2015 Rosetta Stone generated revenue in the amount of $217.67 million, down on the $261.85 million recorded by the Company in 2014. The bulk of the Company’s revenue, $151.70 million, was recorded as subscription and service revenue, with the remainder categorised as product revenue.


Java has a standard interface named java.lang.Runnable
with the single method run
. The method has no arguments and returns nothing.
You should implement the given method createRunnable
that takes two arguments: text
and repeats
. The method must return an instance of an anonymous class implementing java.lang.Runnable
. The overridden method of the anonymous class should print the text
to the standard output a specified number of times (repeats
).
Use the provided code template, do not write the standard interface java.lang.Runnable
.
For example, if the text
is "Hello!" and repeats
is 3, the output should be:
Hello!
Hello!
Hello!


About Me
Hello World.
This is 高瑗(Andrea Gao).
I grew up in Chongqing, China. Guangzhou, Shenzhen, California, North Carolina, Mexico City are the places I’ve lived in for more than 3 months. Currently, I try to stay in NYC for most of my weekends.
I am
- a developer/data scientist/consultant at Boston Consulting Group
- an advocate of women’s right and LGBT rights
- a Chinese calligrapher and art lover
I create this blog to share and connect:) Hopefully, you will be somewhat inspired or find a way to debug your code here.
Contact
- Hit me up at the bottom left corner of this page
- Shoot me an email at<EMAIL_ADDRESS>Images Reference
- Blog: Sangluan Tie(丧乱帖) by Wang Xizhi(王羲之)
- Project: Pipa Xing(琵琶行) by Wen Zhengming(文徵明)
- About me: John the Baptist by Caravaggio, 1604


{{currentError}}
{{currentNotice}}
{{program.enrolledProgram._openmrsModel.display}} {{program.enrolledProgram._openmrsModel.location?.display}}
The patient is not currently enrolled in any program
{{program.enrolledProgram._openmrsModel.display}} {{program.enrolledProgram._openmrsModel.location?.display}}
Error loading patient program config. Please make sure that your network is working fine.


Copy this link to share your caught Pokémon
Filters
This is a shared Dex Click here to see your own list


{% set groups = craft.fields.getAllGroups('id') %} {% set elementType = craft.elements.getElementType('Comments_Comment') %}
Select which users are able to make comments, site-wide.
Or, you can set per User Group.


{% extends 'base.html' %}
{% block title %}Membership groups{% endblock title %}
{% block content %}
{% include 'breadcrumbs.html' %}
{% include 'pagination.html' %}
Membership Groups
{% for membership in memberships %}
{{ membership.name }}
{% for member in membership.members %}
{% endfor %}
A {{ membership.name }}
{% if membership.can_read %}
can access
{%else%}
cannot access
{% endif %}
this forum.
{% if membership.can|length %}
They can {{ membership.can|join:", " }}
their own conversations, events and comments.
{% endif %}
{% if membership.cannot|length %}
They cannot {{ membership.cannot|join:", " }}
their own conversations, events and comments.
{% endif %}
{% if membership.is_moderator %}
As moderator,
{% if membership.can|length %}
they can also {{ membership.can|join:", " }}
the conversations, events and comments of others.
{% endif %}
{% endif %}


The purpose of Matter is to provide the most easy-to-use but accurate implementation of Material Design Components.
Matter has probably the lowest entry-barrier among Material Design Component libraries. The only technical knowledge needed to use it is basic HTML5. It doesn't rely on JavaScript, it only needs one to three HTML elements and a CSS class per component to work. The markup of the components is semantic by design.
Matter is built with theming in mind. Its components can be customized by specifying certain colors and/or fonts. The granularity of customization is variable: components can be themed on global level, component level, component instance level, or on any level between.
Large
Medium
Small
Xmas Tree


The Best Daily Deals in Denver
show
Escapes view more »
Rocky Mountain Lodge
Elkhorn Lodge and Guest Ranch • Estes...
All-Inclusive Beachfront ...
Hola Grand Faro • San Jose del Cabo, ...
10-Day China Tour + Flights
Chinatour.com International • Beijing...
Pineapple Island Hotel
Hotel Lāna'i • Lanai City, HI
Adventures view more »
Rocky Mountain Triathlon ...
Silverthorne, CO
Sunset Kayaking, Margarit...
Denver, CO
Mile High Movie Under the...
Denver, CO
Go-Kart Racin' + Hot Wing...
Englewood, CO


Here at fetch, we're committed to bringing you and your dog closer together. Through adoption options, supplies, and more we're here to help you through it all.
Finding a dog can be hard. Our matchmaking process can take the stress out of the search, and bring adoption and breeder opttions to you.
Through our partnerships, you'll have access to deals at your favourite local shops for treats, toys, and anything else you need!


ghpage-auto-deploy
This is the sample page. Visit
ghpage-auto-deploy
to deploy your ghpage automatically!


System |
|||
|---|---|---|---|
| Productionize Model | Web Service | Online Model Training | |
| Hyperopt-sklearn | - | No | - |
| Auto-sklearn | Export model as a .pickle file. | No | - |
| TPOT | - | No | - |
| H2O AutoML | Export model as POJO or MOJO format. | No | - |
| SAS | Yes | - | |
| MLBox | - | No | - |
| Google AutoML | Classification models are stored in the platform and can be loaded from there. | Yes | Yes, batch prediction. |
| Azure Machine Learning | Export model as a .pickle file. | Yes | - |
| MLJar | Export model as .model files. | Yes | - |
| ATM | - | Yes | - |
| Auto_ml | Export model as a .dill file. | No | - |
| Amazon SageMaker | Yes | - | |
| Uber Ludwig | Model is saved as a group of files, which can be loaded using a ludwig method. | No | - |
| TransmogrifAI | - | No | - |
| AutoKeras | Export model as a tf.keras.Model instance. | No | - |
| Feature Tools | Export features as .csv file. | No | No |
| tsfresh | - | No | No |


I would still say this has remained the same as when I begun foundations. What I plan to do in the long term would probably be dependent on what parts of web development I really fall in love with, am thinking that could potentially be video game design or more backend type stuff but am more that ready to have my mind changed!
The strength the I really think is soing to help me the most for the upcoming bootcamp is my commitment to bettering myself. I know this is not the most flashy example of what I can do but I am more than ready to get stuck into bootcamp and make the most of the opportunity thtat I have in front of me. My biggest limitation and its really only something Ive noticed during the foudnations period is that im really not very good at asking for help. Be that as it may im really going to try and do better at this as I know that everyone at EDA is there to support me and want to see me do as well as I want to.
Honestly, I think it could be the workload. 60 hours a week sounds rather daunting and I think balancing all the work I am going to need to do whilst also maintaining a good sleep cycle, not dropping off the face of the earth and still exercising could prove a little difficult.
I want to hold myself accountable at all times. If im not doing what I need to be doing then I need to kick into gear and stop slacking as I know im not going to have the time. I also just want to do everything to the very best of my ability. Doesn’t have to mean I put crazy hours into every little thing I do but I wan tto make sure that I am happy and really trying to take no board all the information and constructive critisismes that will come my way.


?New
York
Botanical
Garden
Ib24bfl2
Presented
to
LPU
Horbanum
by
T.
G.
Yuncksr
TRUMAN
G.
YUNCKER
HERBAMW
OF
DEPftUW
UNIVERSITY
(DPU)
PURCHASED
BY
NY
IN
1987.
HERBARIUM
T.
G.
YUNCKEK
Lisianthius
longifolius
L.
E>et.-rev.
M.
Thiv
(B)
2001
DEPAUW
UNtV.
HERBARIUM.
PLANTS
OF
JAMAICA
Parish:
St.
Ann
Date:
Feb.
18,
1958
BOt.
Name:
Lisianthus
longifolius
L.
È
vein.
Name:
Jamaica
Fuchsia.
Herb,
3-U
ft.
high;
flowers
yellow.
On
rocky
embankment,
on
way
to
Hollymount.
Alt.
2OOO-25OO
ft.
Collector:
T.
G.
YUNCKER
No.
18,217
1624682
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


|
FESTR 0.9
Finite-Element Spectral Transfer of Radiation
|
#include <ArrDbl.h>
#include <Database.h>
#include <Goal.h>
#include <Grid.h>
#include <Hydro.h>
#include <Mesh.h>
#include <Polygon.h>
#include <Progress.h>
#include <Ray.h>
#include <Vector3d.h>
#include <map>
#include <string>
Go to the source code of this file.
Classes | |
| class | Detector |
| Detector object. More... | |
Typedefs | |
| typedef std::map< IntPair, ArrDbl > | SpecPatch |
| contains ArrDbl objects indexed by a pair of integers More... | |
Functions | |
| std::string | time_string (const size_t it, const int ntd, const double t) |
| Converter of time ID to string. More... | |
| std::string | time_fname (const size_t it, const int ntd) |
| Converter of time ID to string. More... | |
| std::ostream & | operator<< (std::ostream &ost, const Detector &o) |
| Send string version of Detector to an output stream. More... | |
Detector objects.
Definition in file Detector.h.
contains ArrDbl objects indexed by a pair of integers
Definition at line 40 of file Detector.h.
| std::ostream & operator<< | ( | std::ostream & | ost, |
| const Detector & | o | ||
| ) |
Send string version of Detector to an output stream.
| [in,out] | ost | Output stream |
| [in] | o | Detector object |
Definition at line 1523 of file Detector.cpp.
| std::string time_fname | ( | const size_t | it, |
| const int | ntd | ||
| ) |
Converter of time ID to string.
| [in] | it | Current time step index |
| [in] | ntd | Hydro::ntd = Number of digits to represent Hydro::ntimes |
Definition at line 1516 of file Detector.cpp.
| std::string time_string | ( | const size_t | it, |
| const int | ntd, | ||
| const double | t | ||
| ) |
Converter of time ID to string.
| [in] | it | Current time step index |
| [in] | ntd | Hydro::ntd = Number of digits to represent Hydro::ntimes |
| [in] | t | Current time instant (seconds) |
Definition at line 1508 of file Detector.cpp.


- January ↑ $ 35,000
- February ↓ $ 25,000
- March ↓ $ 23,000
- April ↑ $ 30,000
- May ↑ $ 31,000
- June ↓ $ 29,000
- July ↑ $ 35,000
- August ↑ $ 37,000
- September → $ 37,000
- October → $ 37,000
- November ↑ $ 38,000
- December ↑ $ 40,000
- 1st Quarter ↑ $ 83,000
- 2nd Quarter ↑ $ 90,000
- 3rd Quarter ↑ $ 109,000
- 4th Quarter ↑ $ 115,000
- 2009 ↑ $ 120,000
- 2010 ↓ $ 109,000
- 2011 → $ 109,000


If you would like to pay by check, please mail you check to:
Museum of Chinese in America
215 Centre Street New York, NY 10013
Payable: Museum of Chinese in America
Note: MOCA Spike 150 (note the ambassador or club you support if any)
All contributions greater than $100.00 are eligible for donor benefits.
Any question please email to mocaspike150@mocanyc.org


To perform analysis on user specific data, the VCF/BCF file must be indexed by GQT tools. Below are the two steps to create GQT indexed files:
bcftools index your_file.vcf.gz
gqt/bin/gqt convert bcf -i your_file.vcf.gz
The indexing can be performed either on VCF or BCF file. Then provide GQT created indexed files as input to the webGQT by clicking Browse tab.
Required input files:
your_file.bcf
your_file.bcf.gqt
your_file.bcf.bim
your_file.bcf.vid
your_file.bcf.off
your_file.bcf.csi


Deepak Mittal is an Application Engineer(Software Development) at Newgen Software. He is the founder of Vanijya Technology. Before founding this start-up, he spent many years learning data analysis and programming. He is also an active adviser to other start-ups. While working on the development of Vanijya Technology, he has built effective communication skills and expertise in dealing with key stakeholders and potential clients to deliver stunning experience.
He has a data science professional certificate from IBM through Coursera. He likes to study personal finance, investing, security analysis, data science, machine learning, business analytics, and personal branding. He has experience in data analysis, programming, trading, and community contribution.
As an active social worker, he builds a network with other people and discusses how they can learn about new tools and technologies. So far he helped thousands of students including underrepresented students living in the rural areas in learning to write to code. He organized many technical events to encourage students to make their careers in technology and learn to write to code. He also worked as a Campus Ambassador to many prestigious institutions and Paytm.
Newgen Software is a globally recognized provider of Low Code Automation Platform for Digital Transformation
As an Application Engineer, I develop applications using Low Code Automation Software,Javascript, JSP, SQL Server, and Java.
Vanijya Technology is a start-up, incubated in MIET Incubation Forum. I started it with my colleagues to empower small businesses and to provide the modern tools and technologies they need. During my work at Vanijya Technology, I collected data from more than 30 businesses and their suppliers about their business problems. I met with hundreds of people and worked with them on their information collection and decision-making. I consulted them on how they can facilitate their decision-making with modern tools and technologies. I analyzed collected data using machine learning models and natural language processing and presented it in the form of a dashboard.
Learn Student Ambassadors are a global group of campus leaders who are eager to help fellow students, create robust tech communities and develop technical and career skills for the future.
Microsoft Student Partners (MSPs) are student technology leaders, empowered to build Microsoft communities on their campus and share their deep knowledge and passion for technology with their fellow classmates.
Itresolute is a startup that provides web development and consulting solutions to small businesses. During my work at Itresolute, I collected data from small businesses and prepared reports on what problems small businesses face and what solutions are available. I also worked extensively on data analysis and python development.
Student Satellite Development Program is a research program at MIET. A cross-functional team works together to achieve a common goal. Along with research, people come up with great ideas and discuss them with the team. It is a diverse group and people learn from each other's experience and guidance. I worked on data collection & analysis and thermal analysis under the supervision of Prof. Masood Anzar.
I love to connect with the people who work for the upliftment of the society and take stringent actions for it.
In my free time I like do plantation and meditation.
I easily mix-up with the people of different backgrounds and this is my major strength for high efficiency.


Buttons You should use buttons more often than you're used to. If it has a click listener, it should probably be a button. Please don't do this This is wrong Do this! Do this! Okay, but use omrs-unstyled instead Button types Filled button Outlined button Link button Unstyled button Filled button Outlined button Code example: A button A button


Scheduler rules management
Edit (pull request)Since version 3.4.0, a basic DSL editor is provided to set advanced parameters of the RMS Scheduler plugin.
DSL
A basic builtin DSL is provided by the plugin, but you can add your own DSL definitions. This can allow you to translate DSL in your own language, or to give more signification to sentences.
For example, if you have a sensor that injects a metric named “Load_Average” in the rule engine, you can already use the builtin DSL to add condition to your policy :
Edit (pull request)


Close shave again for Renukacharya during 'Hori Habba'
by PTIBJP MLA M P Renukacharya again had a narrow escape when the 'Hori', the caparisoned bull, ran amok soon after he touched it at Honnalli in Davangere district on Friday.
This is the second time he has had the close shave.
On August 31, Renukacharya was about to be hit by the Hori.
The Hori Habba (Hori festival)is celebrated in which a well-decorated bull is made to run through the crowd The challenge is to subdue the animal and snatch the dry coconut, cash and other valuables tied to it.
In Honnalli, the organisers invited Renukacharya who obliged.
Before setting the Hori on the crowd, the organisers asked the MLA to worship it.
As soon as he touched it, the bull jumped and lowered its head as if it to butt.
Sensing the danger, Renukacharyas bodyguards encircled him and took him to safety away from the place.
Nothing has happened to me.
I am fine, said Renukacharya after the incident.


{% set page = 'android-apps' %} {% set title = 'Android application to crowdsource AI/SW/HW co-design experiments' %} {% extends 'ck.html' %} {% block content %}
You can download and install the latest version of our simple Android demo
to participate in collaborative benchmarking, optimization, autotuning
and co-design of AI-based applications: APK Version 2.12.
Just make sure that your Android device is configured to allow
installation from sources other than the Play Store before
downloading and installing our CK-based Android apps.
You can check it as follows:
You can see all aggregated results from these experiments (speed, accuracy, costs) across diverse mobile phones in the public repository (preview a new beta version of this repository).
Our applicaiton downloads slightly modified AI pipelines assembled from cKnowledge components (frameworks, models, datasets) and runs them across diverse platforms and environments provided by volunteers similar to SETI@home to collaboratively find the most efficient AI solutions in terms of speed, accuracy, costs and other metrics or automatically detect software and hardware bugs (see paper 1 and paper 2).
We use this open-source technology is used in the open and reproducible ACM ReQuEST tournaments to co-design Pareto-efficient deep learning stacks (speed, accuracy, costs) and in the open project with Raspberry Pi foundation to crowdsource compiler autotuning and machine learning!
You can check out another Android application to help crowdsource benchmarking and autotuning of popular compilers (LLVM, GCC): Version 2.5 [ View GCC results , View LLVM results , See open sources , View interactive report (Raspberry Pi foundation) ]
Please feel free to get in touch with the CK community to provide your feedback or discuss results!


|
hcash
2.0.0
hcash
|
#include <llex.h>
Public Attributes | |
| int | current |
| int | linenumber |
| int | lastline |
| Token | t |
| Token | lookahead |
| struct FuncState * | fs |
| struct lua_State * | L |
| ZIO * | z |
| Mbuffer * | buff |
| Table * | h |
| struct Dyndata * | dyd |
| TString * | source |
| TString * | envn |
| char | decpoint |
| Mbuffer* LexState::buff |
| int LexState::current |
| char LexState::decpoint |
| struct Dyndata* LexState::dyd |
| TString* LexState::envn |
| struct FuncState* LexState::fs |
| Table* LexState::h |
| struct lua_State* LexState::L |
| int LexState::lastline |
| int LexState::linenumber |
| Token LexState::lookahead |
| TString* LexState::source |
| Token LexState::t |
| ZIO* LexState::z |


{% extends "global/Page.html" %} {% load staticfiles otree_tags %} {% block title %} Overview {% endblock %} {% block content %}
This study will have three parts.
First, we will explain the bargaining situation and how you will negotiate with the two other participants. In this part of the study there will be no time limit. Please read all instructions carefully to make sure you understand the situation.
Second, you will negotiate with two other participants for a sum of money {% if incentives %} that will be converted in a bonus payment. {% endif %} During this part, you will have to complete each page in {{ timeout_time_minutes }}0 minutes. This is to ensure that others are not waiting too long.
Third, we will ask you some questions about you and about the study. During this part of the study there will be no time limit.
On the next screen you will receive information about the seats that can be obtained by each party.
Dear participant,
This experiment does not work on Internet Explorer and Microsoft Edge. Please use another browser, such as google chrome or firefox to continue.


Goals available for this plugin:
| Goal | Report? | Description |
|---|---|---|
| bundle:ant | No | Generate Ant script to create the bundle (you should run ant:ant first). |
| bundle:baseline | No | BND Baseline check between two bundles. |
| bundle:baseline-report | Yes | BND Baseline report. |
| bundle:bundle | No | Create an OSGi bundle from Maven project |
| bundle:bundleall | No | Deprecated. The bundleall goal is no longer supported and may be removed in a future release |
| bundle:clean | No | Clean an OBR repository by finding and removing missing resources. |
| bundle:cleanVersions | No | Clean OSGi versions, ie convert a group of versions to OSGi format. |
| bundle:deploy | No | Deploys bundle details to a remote OBR repository (life-cycle goal) |
| bundle:deploy-file | No | Deploys bundle details to a remote OBR repository (command-line goal) |
| bundle:index | No | Index the content of a maven repository using OBR |
| bundle:install | No | Installs bundle details in the local OBR repository (life-cycle goal) |
| bundle:install-file | No | Installs bundle details in the local OBR repository (command-line goal) |
| bundle:instructions | No | Generate BND instructions for this project |
| bundle:manifest | No | Generate an OSGi manifest for this project |
| bundle:remote-clean | No | Clean a remote repository file. It just looks for every resources and check that pointed file exists. |
| bundle:verify | No | Verifies OSGi bundle metadata contains valid entries. Supported
checks in the current version:
|
| bundle:wrap | No | Deprecated. The wrap goal is no longer supported and may be removed in a future release |
The following specifies the minimum requirements to run this Maven plugin:
| Maven | 2.0 |
| JDK | 8 |
| Memory | No minimum requirement. |
| Disk Space | No minimum requirement. |
You should specify the version in your project's plugin configuration:
<project> ... <build> <!-- To define the plugin version in your parent POM --> <pluginManagement> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>4.2.0</version> </plugin> ... </plugins> </pluginManagement> <!-- To use the plugin goals in your POM or parent POM --> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>4.2.0</version> </plugin> ... </plugins> </build> ... <!-- To use the report goals in your POM or parent POM --> <reporting> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>4.2.0</version> </plugin> ... </plugins> </reporting> ... </project>
For more information, see "Guide to Configuring Plug-ins"


This page demonstrates IRMA attributes disclosure, using the IRMA API server that you specify below. Be sure to enter an IP address or domain name that your IRMA app is able to connect to (i.e., localhost
will generally not work).
Examples (assuming your IP address is <IP_ADDRESS>
):
<IP_ADDRESS>:8088
<IP_ADDRESS>:8088/irma_api_server
Status: none
| Attribute ID | Value |
|---|
Content of JSON web token returned by API server:


ColorMod:
Recoloring 3D Printed Objects using Photochromic Inks.
With recent advances in 3D printing, objects can now be fabricated in full-color. However, once an object is
fabricated, the color is permanent and cannot be changed again: every change requires printing a new version
leading to additional printing time and material usage.
To avoid reprinting objects, researchers suggested to digitally project the desired color onto the object.
However, the color disappears once the projector is switched off or the object is removed from the setup.
Recently, researchers have started to explore a different approach: By using photochromic materials
that can switch their appearance from transparent to colored when exposed to light of a certain wavelength,
the color of existing objects can be changed without the need to re-fabricate it.
The color remains even when the object is removed from under the light source.
This process is fully reversible, thus allowing users to recolor the object as many times as they want.
So far, these systems have been limited to single color changes, i.e. changes from transparent to colored.
In this paper, we present ColorMod, a method to extend this approach to multi-color changes (e.g., red-to-yellow).
As shown in Figure 1, the key idea of ColorMod is to 3D print a dense multi-color pattern with one color per voxel
across the entire surface of the object.
When recoloring the object, ColorMod locally activates only the voxels with the desired color and turns all other voxels off.
Figure 1:
ColorMod is a method that allows users to recolor objects even after fabrication.
To accomplish this, ColorMod uses
(a) 3D printing of photochromic inks in a dense multi-color pattern.
(b) When users apply a specific color texture using ColorMod’s user interface,
only the voxels with the matching color are activated.
(c) The same object recolored multiple times.
Background on Photochromic Materials
To provide the necessary background knowledge for the technical part of the paper,
we briefly describe different properties of photochromic materials:
Color of Transition State:
Most photochromic materials change from transparent to colored upon activation with a light source—however,
photochromic materials for reverse conditions also exists, where the activated state is transpar-ent and the deactivated state is colored.
Fading Out vs Persisting:
Most photochromic materials transition back to the deactivated state once removed from the light source
(known as
T-type photochromics). But for a certain class of photochromics known as
P-type photochromics), the color persists,
i.e. the activated state continues even after the material has been removed from the light source.
Activation/Deactivation: Photochromics are typically activated by a
UV light source (wavelength 250nm to 390nm).
Deactivation typically requires a
visible light source (390nm to 790nm). There is no single activation wavelength.
Activation occurs rather over a spectrum with one wavelength supplying the peak energy (see Figure 2). In practice,
this means that activation occurs at different wavelengths rather than only at its peak, but activation may take longer.
Activation also occurs at a much higher absorbance rate than deactivation, thus activation takes less time.
Saturation of colors: The saturation of the color is deter-mined by the amount of energy induced by the activation light source
(i.e., the UV light). The more energy induced, more saturated the color becomes.
The properties described above also apply to other color-changing materials: While photochromics are activated by light,
there are also color-changing materials that are acti-vated by temperature (thermo-chromic),
electricity (electrochromic), and pressure (piezochromic)—the only difference being the source that induces the color-change.
Figure 2:
Activation/Deactivation spectrum for the photochromic dyes we used.
ColorMod – Recoloring 3D Printed Objects
The main contribution of ColorMod is a method to create 3D objects that allow for multi-color changes in their appearance even after
fabrication. It works by placing differently colored photochromic materials in a dense multi-color voxel pattern across the entire
surface of the object (see Figure 3). During recoloring, only the voxels with the desired color are activated; all other voxels
remain deactivated and transparent. While the resolution of our 3D printer and projector/camera setup is limited resulting in the
color pattern to appear coarse, future advances in hardware will likely raise the resolution by several orders of magnitude.
Because painting such a dense multi-color pattern onto the object’s surface by hand is not feasible,
we developed a custom 3D printable material based on photochromic dyes (see section ‘Material’). Our material is made from
a p-type photochromic dye; thus color-changes persist even when the object is removed from under the light source.
In the following section, we describe the hardware/software setup behind ColorMod and provide details on the material mixing procedure.
Figure 3:
A dense pattern of different photochromic voxels allows for multi-color changes in the same area.
System Setup
Our hardware setup consists of three components:
(1) For
activation, we use a UV light (Luminus Devices Inc. CBM-40-UV, ~355nm, 4W)
that we automatically turn on/off using a digital controller (PhatLight LED Develop Kits).
(2) For
deactivation, we use a regular visible-light projector (CASIO XJ-A140, XGA 1024x768 pixels, 2500 ANSI lumens).
(3) For 360° projection on the object, we use a rotat-ing platform that is controlled via a relay switch (
Adafruit Industries PowerSwitch Tail II) connected to an Arduino.
In addition to these three main components, we use a regular RGB camera (PointGrey Chameleon3 CM3-U3-13S2C-CS, 1024x768 pixels)
to calibrate the projector position with the rotating platform. The camera can be removed once the system is calibrated.
Figure 4:
The ColorMod hardware setup.
Figure 4 illustrates how the components are positioned with respect to each other.
To ensure the image is in focus, the visible-light projector is placed at a distance that matches its focal length with the
rotating platform. In our case, the distance is 71.12cm. The UV light is placed as close as possible to the object to maximize
the activation energy (but far enough to not interfere with the visible light projector). Finally, the camera is placed at a
distance that ensures it can see the image projected onto the object. All components are placed on the same axis for easier calibration.
Mechanism for Activating and Deactivating Colors
To change the color of an object, we proceed as follows:
(1) First, we use the UV light to globally activate all voxels thereby flipping all voxels from transparent to colored
(with our UV light source, this takes ca. 68s).
(2) In the second step, we use the visible light projector
to selectively deactivate voxels whose color are not part of the final appearance (takes ca. 253s (~ 4 minutes)).
We rotate the object with the rotating platform to reach voxels on all the sides of the object.
We rotate in 90 degree increments: four times for activating all colors and four times for selectively deactivating colors.
Thus, activation takes 5 minutes in total (4 x 68s per side) and deactivation takes ~ 17 minutes in total
(4 x 253s per side). Rotating the object takes 16s per side (two times 3 rotation = 6 x 16s = 96s).
Adding this up, a complete recoloring process involving all steps takes about 23 minutes.
As previously discussed in section ‘Background’, this pro-cess can be further sped up in several ways by:
(1)
Using more powerful UV light, i.e. a light source with more lumen.
(2)
Placing the light source closer to the object to maximize light intensity:
Using a visible light projector with a shorter focal length would allow us to place both the projector
and the UV light closer, thus further speeding up the activation/deactivation process.
(3)
Using a light source that perfectly matches the target wavelength: We use a single activation light source (~355nm);
however, as illustrated in Figure 2, different photochromic colors have different peak activation wavelengths, in our case 310nm, 270nm,
and 350nm for red, blue, and yellow.
A faster charging setup would use multiple UV lights with individually matching wavelengths.
The same holds true for the deactivation light source: We only use one deactivation light source,
i.e. visible light (390nm to 790nm); however, deactivation would be faster by having a light source that matches the wavelength
required for the specific photochromics.
(4)
Using a UV projector rather than a UV light source: A UV projector would allow us to selectively activate voxels;
deactivation with visible light would thus not be required during every recoloring step but only to deactivate voxels
that are no longer required. However, UV projectors for 295-365nm are expensive
(ca. $4,000 - $8,000, e.g. model WINTECH PRO6500 and VISITECH LE4960H-UV) whereas a single UV light only costs around $150.
This makes our setup suitable for consumers and easy to replicate by HCI researchers.
USER INTERFACE
ColorMod offers a user interface implemented as a plug-in for the 3D editor Blender.
It supports the user with both steps of the ColorMod processing pipeline (Figure 5):
Figure 5:
Interaction pipeline: preparing the 3D model for fabrication, then recoloring the model.
(1) Preparing the 3D model for 3D printing by converting the model into the corresponding voxel-material representation.
This only needs to be done once before the model is printed.
(2) Re-coloring the object after it has been printed. Since this is a reversible process,
users can repeat the process as often as they like.
#1 Converting the 3D Model for Fabrication
Users start by either creating a new 3D model or by loading a 3D model from a database such as
Thingiverse.
To convert the 3D model for the photochromic printing process, users first select the desired colors from the menu (e.g., red, blue, and yellow), then hit the ‘process’ button in ColorF-ab’s user interface. As can be seen in Figure 6, our software responds by converting the model accordingly.
Figure 6:
(a, b) Converting a 3D model into the ColorMod voxel-color representation and (c,d) 3D printing it.
The conversion consists of
(a) splitting the model into individual voxels,
(b) assigning a photochromic color to each voxel, and
(c) generating a set of files for 3D printing—one file for each photochromic printing color, and one for the infill of the object
(both are in .stl file format). Users can then load the .stl files into the 3D printer and print the ob-ject.
(d) The object comes out fully colored from the 3D printer due to the internal UV light used by 3D printer for curing the materials during printing.
#2 Coloring the Printed Object
After the object is fabricated, users can change its color as often as they like.
Figure 7 shows how the user changes the printed ring from one color pattern to another.
(a) The user starts by placing the object onto the rotating platform of the projector-camera setup.
The object is held in the center of the platform through a small magnet.
The user then clicks the ‘prepare’ button in ColorMod’s user interface.
(b) Once ColorMod located the object on the rotating plat-form, it displays the 3D model and the painting tool in the 3D editor.
Users can take the brush tool and choose a color from the color palette to draw the desired appearance onto the 3D model
(the color palette is constrained to only those photochromic colors that the object contains).
(c) When the user hits the ‘process’ button, ColorMod first computes which voxels need to be activated and then
(d) executes the desired pattern by activating all voxels first and, then
(e) selectively deactivating voxels.
(f) On completion, users can take the object from the platform and use it with its new appearance.
As illustrated in Figure 8, users can repeat the process of recoloring the object as many times as they like.
Figure 7:
Recoloring an object.
Figure 8:
The same object recolored multiple times.
Material for 3D Printing Photochromics
To enable the process described above, we developed our own photochromic ink suitable for 3D inkjet printing (Figure 9).
While photochromic plastic filaments for extrusion based 3D printers exist (e.g., MakerBot Photochromic PLA),
these types of printers are not suitable for printing full-color patterns in which each voxel has a different color.
For our ink development, we focused on 3D inkjet printing with polyjet 3D printers that mix the color binder directly into
the jet-able base ink.
A different formula will be required for powder- or paper-based inkjet 3D printers.
Figure 9:
Ink mixing procedure.
(a) Mixing base,
(b) stirring base,
(c) adding photo-initiator,
(d) adding photochromic dye,
(e) stirring photochromic ink, (f) filtering, and (g) degassing.
Materials and Amounts
Our custom photochromic 3D printable ink consists of three main components:
(1) a
base dye that can also be used for 2D inkjet printing,
(2) a
photo-initiator that causes the base dye to harden during 3D printing (using the 3D printers internal
UV light for photo-polymerization),
(3) the
photochromic dyes to induce color into the base dye.
We purchased the materials from the following vendors:
(1)
base ink: consists of three materials bought from Rahn USA Corp: materials Genomer 2252/G, Genomer1117, and Miramer300,
ca. $268 for 50g.
(2)
photo-initiator: from IGM Resins Inc., material: Irgacure 819, ca. $250 for 50g.
(3)
photochromic dyes: from Yamada Chemicals, colors: blue (DAE-0001, 270nm), red (DAE-0004, 310nm), and yellow (DAE-0068, 350nm),
ca. $95 per gram per color.
Although described as red and blue, the colors from Yamada Chemicals appear to be closer to the colors magenta and purple (see Figure 3).
Required Equipment
For creating our material, we used the following equipment:
(1) a magnetic stir bar and stir plate for mixing the different components (ThermoFisher Scientific model no. SP88857100),
(2) a degasser for removing air bubbles from the mix (Yescom 5 Gallon Stainless Steel Vacuum Chamber Kit),
(3) a syringe filter with resolution of at least 1/10th of the print head nozzle size for removing impurities that can clog the printhead
(we used a 1 µm filter since our print head diameter is 30 µm, FisherScientific model no. 09-801C).
Mixing Procedure
Figure 9 shows the ink mixing procedure.
We prepared the base dye for 100ml by mixing Genomer2252/G (32g), Ge-nomer1117 (59g) and Miramer300 (9g)
for one hour on the stir plate at 600rpm. We then added the photo-initiator to the base dye by mixing 2g of Irgacure 819
(1g for every 50g of base dye).
We then added the photochromic dye by mixing 0.1g of either DAE-0001, DAE-0004, or DAE-0068 (0.1g for every 100g).
The entire solution was then mixed again on the stir plate at 600rpm for one hour to dissolve the particles of the dyes in the base ink.
We then passed it through the syringe filter to make sure that no large particles remained.
Finally, we degassed the ink to remove air bubbles that were generated from the filtering process.
Material Usage and Storage
100g of the resulting photochromic ink can produce ~91 cm3 of 3D printed material.
The material can be stored for several months before the color decays.
The duration depends on the storage conditions, i.e., keeping it in a dark environment extends the duration.
Additional Considerations
Particle size: Most dyes contain large particles that tend to clog the inkjet printing nozzles.
Reducing the particle size typically includes addition of surfactants. This addition of surfactants,
however, proves problematic to the photo-chromic properties, as it acts as a coating to the dye.
This may not be optimal when trying to expose the dye to UV or visible light. After testing different dyes,
we found that the dyes from Yamada Chemicals are soluble in our base dye,
i.e. particles are dissolved in the ink instead of dispersed; thus, we use them for all objects in the paper.
Viscosity and surface tension: An ink’s printability depends on its viscosity and surface tension.
If the material is too viscous, it cannot be jetted. However, if the material is too thin,
it will not have stable jetting. The viscosity needs to be at a range of 10-15cp and the surface tension needs to be
around 20-25 mN/m for stable jetting. The base dye was formulated to be within this range. Adding photochromic dyes (0.1g to 100g of base ink)
showed little to no change to the ink’s viscosity and surface tension, thus we were able to use it without further adjustment.
Color Spectrum
While only a few photochromic colors can be commercially purchased,
we found several ways to increase the color spectrum achievable with the colors we were able to buy.
Saturation of Colors
We can vary the saturation of a color in three ways:
(1) During
ink preparation, we can add more photochromic dye to the base ink, which leads to a stronger color and faster reaction time.
However, this also results in additional particles in the solution, which could potentially clog the printer nozzle.
(2) During
activation, we can stop supplying energy half way through, which results in a less saturated color,
e.g. a light blue rather than a dark blue. (3) During deactivation, we can only partially discharge a voxel. Figure 10 illustrates this:
the top voxels were discharged for a longer time than the voxels at the bottom, leading to a gradient saturation from top to bottom.
Figure 10:
Varying saturation: the voxels at the top are discharged longer, leading to a less saturated color.
Mixing Photochromic Dyes
Interestingly, we found that by mixing two photochromic dyes,
we can achieve an intermediate photochromic color just as one would expect from mixing two regular inks.
For instance, we created a green photochromic ink (Figure 11)
by mixing blue and yellow dyes in different amounts during ink preparation (e.g., 1:2 of DAE0001 and DAE0068).
Figure 11:
Green material produced from blue and yellow.
Perceptual Illusion of Additional Colors
When multiple colors are printed in a dense pattern, research has shown that humans perceive a gradient color.
While our current system resolution is too low for this perceptual illusion, a future version could increase
the range of colors by visually blending them,
e.g. blue and red activated close to each other could lead to the perception of a purple voxel.
Implementation
In this section, we describe the processing pipeline behind our system. An overview of the whole process is shown in Figure 5.
Both 3D model conversion and the painting inter-face are implemented in Python and as a
plug-in to the 3D editor Blender.
We use OpenCV as part of the projector-camera calibration.
3D Printing: Split 3D Model into Multi-Color Voxels
We start by converting the 3D model into a high-resolution geometric voxel representations using the algorithm.
In short, this algorithm samples, low-pass filters the model into a multi-resolution volume and applies marching cubes
for extracting a polygonal mesh and to simplify the voxels.
For our setup, the geometric voxel size is approx. 0.05mm x 0.05mm x 0.05mm.
Since only the outer shell of the model is printed with photochromic material and the inside is printed with a regular white material,
we need to determine which voxels lay on the outside and which on the inside before assigning mate-rials.
A voxel lays on the inside if it has six adjacent voxels
(four adjacent voxels on the same layer and one adjacent voxel on each the upper and lower layer).
If a voxel has less than six adjacent voxels,
it lays on the outside. Figure 12a shows the process of counting adjacent voxels.
Since we print multiple shells to achieve a saturated color (see our paper, for more detail),
we repeat the process until the number of shells equals the desired shell thickness (Figure 12b).
Figure 12:
Determining which voxels lay on the outside and which on the inside.
Only outside voxels have a photochromic color assigned, inside voxels are of regular white material.
A color voxel has one of the colors the user selected from the user interface, in the case of the ring in
Figure 8 the col-ors are red, blue, and yellow. We start at the bottom layer and label the voxel as R, B, and Y, respectively (Figure 13a).
We then repeat the process along the circumference.
Moving up, we offset the colors. Since we group 20 geometric voxels into one color voxel, the offset appears every 20 voxels (Figure 13b).
Figure 13:
Grouping of geometric voxels to color voxels.
After we assigned a color to each geometric voxel, we ex-port one 3D printable .stl file per color,
resulting in three .stl files for the photochromic materials and one .stl file for the white infill material.
Each .stl file is then assigned a printing material in the 3D printing software.
3D Painting: Color Map Preparation for Projection
After the user places the object on the platform and hits the
prepare button,
our system loads the projector calibration parameters that was measured in advance into
Blender’s virtual camera.
The software then prepares the projection viewport and runs the 3D painting tool.
When the user finishes painting the 3D model and hits the ‘process’ button,
we match the painted voxels to the photochromic color voxels previously assigned to the fabricat-ed object.
If in the painted 3D model a color voxel has the same color as in the printed 3D model, we mark it as black.
Since black results in no deactivating light from the visible light projector, the corresponding physical voxel will not be deactivated.
Otherwise, we mark it as white, i.e. it will be deactivated. Figure 14shows the result of this process:
a black/white model (a color map) that we use in the subsequent deactivation stage (see Figure 7c for a 3D version).
After identifying which voxels need to be deactivated, our software runs a small Arduino script that rotates the plat-form in 90 degree increments.
When a specific angle is reached,
the matching colormap transfers the digital design onto the physical object by deactivating all voxels of the undesired color
Figure 14:
Process to determine correspondence color between users’ desired pattern and color map for projection.
Calibration
In order to calibrate the projector-camera system, we first have to obtain the intrinsic and extrinsic parameters of
both the projector and the camera.
For this, we use Zhang’s method that uses a checkerboard.
To obtain the projection matrix, we place a 3D object with known geometry onto the rotating platform. We then calculate the
corresponding points between specific 3D positions from the object and the 2D position in the camera image.
The corresponding points then translate into the projection matrix. We compute the projection matrix once (in advance)
and then load it into Blender’s software when the user starts the painting process, i.e. hits the ‘prepare’ button
Contribution, Benefits, Limitations
With ColorMod, we contribute a method to recolor 3D printed objects even after fabrication.
We contribute the idea of locally activating and deactivating voxels of differ-ent colors,
and a hardware/software system that implements this idea. We also contribute
our own material formula for a 3D printable photochromic ink, which enables fabrication of the color pattern required for our approach.
The key benefit of our method is that it does not require the user to reprint objects for every desired change,
which saves time, reduces waste and does not require additional material.
On the flipside, our approach is also subject to several limitations.
Occlusion: Since we use light to activate/deactivate voxels,
we can only change the color in the areas of an object that can be reached by the projector and UV light source
(i.e. no cavities and undercuts).
Color Decay: While the material we use has a persistent color change, color still
slowly disappears over the course of several weeks (see our experiment in section ‘Evaluation’). The reason for this
is that the deactivation wavelength is also contained in the visible light in our everyday surroundings.
Resolution: The resolution of the 3D printer is too low to be practical at this point (1mm voxel size); but research indicates that
the 3D printing resolution is increasing every year since 2006.
Activation/Deactivation Time: Our current setup takes 25 minutes
for a recoloring process. However, this can be sped up using some of the improvements described earlier, such as using a more powerful
light source.
Printing time: Our inkjet 3D printer requires
a separate pass for every printing material on a layer, thus overall printing speed is slow. Printing the ring in Figure 8 took ca. 8 hours.
Application Scenarios
We envision the following application scenarios for our approach of recoloring objects:
Adaptable Fashion & Accessories
Accessories, such as earrings, bracelets, necklaces, and smart watches tend to be worn on an everyday basis,
making it difficult to pick a color that matches all outfits.
As shown in Figure 15, with ColorMod such accessories can be recolored depending on what the user is wearing.
Figure 15:
Sample 3D printed objects with different desired pattern: (a) ear ring and (b-c) sample sculptures.
Fast Product Design Iteration
In product design, designers often present the physical artifact to the client in order to allow the client to better judge
the look and feel. Even small changes, such as changing the visual appearance of the product require hours of
refabrication and often an additional meeting.
With ColorMod, product designers can adjust the appearance of the product while still in the meeting.
Post-Customization for In-Store Products
While low-cost 3D printing is still too slow to fabricate customized objects in store, we envision that in a first step,
stores will pre-stock mass-manufactured products but let customers select the colors on demand based on their own preferences.
Conclusion
We presented ColorMod, a method for changing the color of a 3D-printed object even after fabrication.
We demonstrated how by printing different photochromic colors in a dense multi-color voxel pattern across an object’s surface,
we can recolor the object by selectively turning specific color voxels on and off. We explained the different factors influencing
how precisely and how fast
we can activate individual voxels and also provided a description of the material formula for our custom 3D printable photochromic ink.
For future work, we plan to make the setup more compact to allow for mobile use. Our long-term goal is to allow users to recolor objects
while on the go using a smart phone with an integrated micro-projector and UV light.
Acknowlegdements
We would like to thank our colleagues from the
Computational Fabrication Group
at MIT CSAIL for the hardware support.
We would also like to thank
Dishita Girish Turakhia for her help with the writing of this paper.
This project is supported by the JSPS KAKENHI grant number
16J00049.


YI YI (A One and a Two)
Reviewed by Harvey Karten Winstar Cinema Director: Edward Yang Writer: Edward Wang Cast: Wu Nien-jen, Elaine Jin, Issey Ogata, Kelly Lee, Jonathan Chang, Chen Hsi-sheng, Ko Su-yun, Michael Tao, Hsiao Shu-shen, Adrian Lin, Yu-pang Chang, Tang Ru-yun, Hsu Shu-yuan, Tseng Hsin-yi.
The pleonastic title of this Taiwanese film reminds me of a play by August Wilson that was staged off-Broadway some time ago, "Ma Rainey's Black Bottom"--about the exploitation of black musicians by white music producers. Throughout the play, the lead musician opened each number with "A one, and a two, and y'all know what to do." The director of "Yi Yi," who, by the way, garnered the well-deserved best director award at the last Cannes Film Festival, stated in an interview that the title serves double-duty (evidently enough). While "Yi Yi" literally means "one one," or "individually," a looser translation is "a one and a two," the typical introduction to jazz numbers--signifying here that nothing really serious is going down. In fact, what stands out from the direction of this family saga is director Edward Yang's taking a complex, generational family story which, if directed in the U.S., would come out something like George Stevens' "Giant," serving it to us as though the narrative really deals with only one or two people. Wang is like the shortstop at Wrigley Field who makes a complex double-play seem like second nature, requiring no effort at all.
Patience, viewers. During the first half hour, Wang throws a stack of characters at us that could make you think that heavy going's ahead. How is he going to sort out this pot pourri so that we absorb the characteristics of each person, and then again, is this going to be one of those avant-garde works that will continue through its almost three-hour length like a loosely structured Robert Altman movie? Not at all.
There is a genuine focus and a sincere theme to the whole tale. The central figure, known as NJ (Nien-Jen Wu) because people in the computer industry get American-style nicknames, is undergoing a mid-life crisis, or more accurately, a malaise. In his mid-forties he is worried. He is beginning to wonder whether he has made mistakes early in life that messed him up to such an extent that he will never be able to retrieve the essence he probably sought as a teenager. NJ is a partner with a reasonably successful computer firm that may go bottoms-up because it is not keeping up with the times. He needs to support his wife, Min-min (Elaine Jin), his teenage daughter Ting-ting (Kelly) and his eight-year-old lad Yang-yang (Jonathan Chang). (The duplication of names is further evidence that no matter how heavy the going, Wang does not intend for us to take his story too seriously.) Because NJ looks honest, he is asked to negotiate a deal with a Japanese designer, Ota (Issey Ogata)--but at a bad time. His mother-in-law (Tang Ru-yun) is in a coma and not expected to live; his teen is involved in her first love affair with a skinny kid named Fatty (Pung Chang Yu), and he has just run into an old sweetheart, Sherry (Ko Su-yun) whom he had stood up some twenty years ago, arranges secretly to travel with her to Japan, and ponders a new life with this woman who still wails about his leaving her in the lurch.
The central narrative in itself may be nothing huge to write home about, but Mr. Yang's power is in his close observation of details. He patiently holds several visuals for a minute or more to give us in the audience a brief break between dramatic scenes but more important to emphasize images of high emotion to the characters. He points out to the pride of his U.S. audience the hold that American culture has on the Taiwanese, shown by the Batman and Robin poster on the eight-year-old's wall and the H&H (New York) bagels shop to which the teens repair on dates if they have not already booked tables at McDonald's. Carefully foreshadowing items that will assume importance later on, he has his A-1 cinematographer Yang Wei-han capture the beauties of nature, particularly the cloud formations that come crashing together yielding thunder and lightning--as though to show that in life, the loveliness and the tempests are intertwined. Opening on a scene involving the wedding of NJ's brother-in- law A-Di (Chen Hsi-sheng) and his pregnant partner Hsiao Yen (Hsiao Shu-shen), Wang demonstrates how the Taiwanese are at least as boisterous as any in a similar situation in the U.S. when the drinks are freely flowing.
Of particular charm is the dialogue conducted in English between the Japanese game designer and NJ as they meet first in Taipei and then in Tokyo, the clever Japanese in effect taking the role of a guru to NJ in much the way that a spiritual leader comforts NJ's wife after she has had a minor breakdown.
Despite the frequent loitering visuals and the occasional monologue, "Yi Yi" moves smoothly along, and though we can guess the fate of the comatose grandmother, Wang throws in a smart twist involving NJ's business that, together with the get-togethers and break-ups of the individuals speaks volumes about the ways we are regularly betrayed and seem never to learn from our miscalculations. Dialogue is in Mandarin, Hokkien and English with English subtitles.
Not Rated. Running time: 173 minutes. (C) 2000 by Harvey Karten<EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


rotten > Library > Biographies > Black Sheep > Uday Hussein > Uday and Qusay Hussein: Post Mortem
For a more extensive gallery of photos, please see http://poetry.rotten.com/uday/.
For a more extensive gallery of photos, please see http://poetry.rotten.com/uday/.
Pornopolis |
Rotten |
Faces of Death |
Famous Nudes
|


Prefabs
When you build a game you need many different objects that you can place in your world. The complexity of objects can range from very simple objects with just one node and component, up to thousands of nodes and components. Some will be placed in scenes, others need to be instantiated dynamically at runtime.
These prefabricated objects are commonly referred to as prefabs. Generally, prefabs in EZ are the same as scenes. Therefore the workflow for creating prefabs is mostly identical.
Video: How to use Prefabs
Templates and Instances
When talking about prefabs, you need to distinguish between prefab templates and prefab instances.
A prefab template is the "original" object. For each prefab there is always exactly one template, which is stored in a dedicated file. When you want to change a prefab, you edit the template.
Once you place a prefab in a scene, that object is a prefab instance. You can create as many instances as you want, and they will all reference the same template.
The idea of prefabs is, that when you modify the template, all instances will automatically update to reflect these changes. This way you can set up placeholder templates early in your project and start instantiating them right away. Over time you can then flesh out the prefabs, without having to manually update your scenes.
Instantiation Process
A prefab is basically just a chunk of a level. It contains game objects (entities / nodes) with components. For example a box prefab would contain a single game object, a mesh component, a physics actor component and a physics box shape. Together these make up an object that looks like a box and behaves like a box.
Now if you want to have such a box in your scene, you need to add a copy of this structure in your level. To have multiple boxes in your scene you would need to copy the same structure multiple times into the scene, and you need to adjust their positions for each object to end up in the desired place.
This is what prefab instantiation is doing for you. It integrates a copy of the prefab template into your scene. Since each object is a full copy, they can then change their state independently.
When a prefab is instantiated, it is decoupled from its template, as it is now a separate copy. Therefore, changing the template will not affect existing instances. To have existing instances show the changes that were made to their template, they must be deleted and recreated from the template. For engine prefabs (see below) the editor does this automatically for you, so while editing a scene, changes to prefabs will always show up immediately. However, while you run your scene, instances cannot be replaced, as they would then lose all their simulation state.
For editor prefabs (see below), the process of updating an instance to incorporate the latest template changes is more complicated, which is why the editor will only do this upon request.
Prefab Types
ezEngine distinguishes between two types of prefabs: Editor Prefabs and Engine Prefabs.
The difference between the two types is, when and where the prefab templates get instantiated. For editor prefabs, the editor instantiates the prefab template and shows all the nodes and components of the prefab in its scene graph. For engine prefabs, the instantiation happens in the engine runtime, here all the editor sees is a single node with a prefab reference component. The editor has no information about the prefab, other than its position.
The image above shows the same prefab instantiated in two ways. One of the barrels is an engine prefab. As you can see in the scene graph, there is only a single node for this object. The other instance is an editor prefab and the scene graph shows the full node hierarchy for it.
Engine prefabs are by far the preferred way to use prefabs. The editor needs to handle less state, the prefabs get automatically re-instantiated every time the template is updated and even when you run a scene in an external application like ezPlayer. Therefore, you can modify a prefab and just launch your stand-alone game, without the need to re-export any of your scenes, and the prefabs will show up in their latest state already. Since the prefab is only instantiated (ie. copied into your world) at runtime, this also takes up less space on disk and is generally more efficient.
Editor prefabs should generally be avoided, except for very rare, special cases. As you can see in the image above, the entire structure of the prefab is available in the editor scene graph. That means you can modify the instance. For example you could switch out a mesh, change a color or even add or delete nodes. Because of this extra flexibility, the editor cannot delete and re-instantiate a prefab when the template changes. Instead, it has to try to merge both your changes and the changes to the template. This process is much slower, and error prone, which is why the editor never does this automatically. Instead, you have to trigger this manually by selecting Tools > Update Prefabs.
The possibility to modify a prefab instance may sound appealing. However, engine prefabs allow you to expose parameters, which you can then set on the prefab reference component.
It is possible to convert back and forth between engine prefabs and editor prefabs in the editor, through the context menu entries under Prefabs > .... When doing so, all customizations to a prefab instance will be lost, though.
Working with Prefabs
In the editor you typically instantiate a prefab by dragging and dropping it from the asset browser into the scene. By default this will create an engine prefab. If you hold Shift
before starting to drag the prefab asset, it will be instantiated as an editor prefab.
If the prefab has exposed parameters, you can set these on the prefab reference component.
Spawning Objects at Runtime
Much game functionality requires to spawn objects dynamically at runtime. This is only possible with engine prefabs. Things like the spawn component store a reference to a prefab asset. They can then be triggered at any time to create a new instance of that prefab.
Surfaces also reference prefabs, to provide dynamic effects like footsteps or bullet impacts.
Prefab Instance Root Node
Prefab templates are allowed to have multiple top-level nodes. When a prefab is referenced in a scene, the node that holds the prefab reference component acts as a root node (or group node) for all nodes that will be instantiated from the template. All instantiated nodes will be attached to this parent node.
This is especially important to keep in mind when writing custom (script) code that searches for a node within a hierarchy. You can give a name to the prefab reference node, and therefore find a specific instance of the prefab. From there on, you can continue searching for nodes by name, and thus find a specific sub-node from the prefab template.


For detailed example and screenshots see Reconciling DERI researchers using Sindice
Sindice is used for two purposes:
-
Identify related RDF datasets
Using
Sindice Search API and
Cache API, RDF Extension can suggest RDF datasets that contain related data to a column in a Google Refine project. The suggestion is based on examining the results returned by searching a sample set of the data via Sindice.
-
Reconcile datasets
You can define Sindice as a target for reconciliation. Most of the times, you will use a domain-restricted reconciliation service (i.e. restrict Sindice search to a particular domain) but you have the option to search the whole Sindice index. Sindice reconciliation service is defined by default once you install the extension (you can find it in the standard Google Refine list of defined reconciliation services labeled Sindice). Further domain-restricted Sindice reconciliation services can be defined through the RDF menu.


Preparation time
overnight
Cooking time
1 to 2 hours
Serves
Serves 6-8
For the beef, preheat the oven to 200C/390F/Gas 6.
Heat a frying pan until very hot. Season the beef with salt and freshly ground black pepper and brush with a little olive oil. Add the beef to the hot pan. Fry on all sides in the hot pan until nicely browned.
Transfer the beef to a roasting dish and place in the oven to cook for 1 hour 10 minutes for rare.
Remove the beef from the oven, cover with aluminium foil and rest in a warm place for 15-30 minutes.
For the Yorkshire puddings, place the flour into a bowl and season with salt and freshly ground black pepper.
Add the eggs and milk to the bowl and whisk to make a smooth batter.
Add the grated horseradish and whisk again to combine. Cover and place in the fridge to chill for at least one hour, but preferably overnight.
Preheat the oven to 220C/430F/Gas 7. Divide the dripping or lard between 2 x 12-hole muffin tins or Yorkshire tins.
Place the tins in the oven for ten minutes until smoking hot.
Carefully pour the batter into the tins, filling the tins two-thirds full.
Place the tins into the oven and cook the Yorkshire puddings for 20 minutes - do not open the door during this time.
After 20 minutes, open the door to allow any steam to escape and turn the temperature down to 190C/375F/Gas 5. Continue to cook until the Yorkshire puddings are golden-brown and crisp.
For the leek gratin, preheat the grill to high.
Heat a frying pan until hot, and add the butter, olive oil and leeks. Fry over a low heat for 1-2 minutes until just softened.
Add the white wine to the pan and simmer for a further two minutes, until the wine has reduced by half.
Add the double cream and cook for a further minute. Season with salt and freshly ground black pepper, to taste, and spoon the creamy leaks into an ovenproof dish.
Sprinkle the grated cheese over the top of the gratin and place under the grill to cook until golden-brown.
To serve, remove the fat from the juices in the beef roasting dish and set it aside to use for another dish (such as for cooking chips).
Place the roasting dish over a low heat to reheat the juices. Carve the beef into individual ribs.
To serve, arrange one rib on each serving plate. Place a spoonful of gratin and a couple of Yorkshire puddings on the side of each portion of beef, spoon the juices over and serve.