docx4j Getting Started
The latest version of this document can always be found in docx4j svn in /docs (in Flat OPC XML format for Word 2007, HTML , and PDF ).
This document was translated from English using Google Translate. If you can improve the translation, please feel free to send in your improved version. For the most recent, always refer to the English version.
What is docx4j?
docx4j is a library for unzipping a docx "package", and parsing the WordprocessingML XML to create an in-memory representation in Java . Recent versions of docx4j also support Powerpoint pptx files.
It is similar in concept to Microsoft's OpenXML SDK, which is for .NET.
docx4j is open source, available under the Apache License (v2). As an open source project, contributions are welcome. Please see the docx4j forum at http://dev.plutext.org/forums/ for details.
docx4j relies heavily on JAXB, the JCP standard for Java XML binding. You can think of docx4j as a JAXB implementation of (amongst others):
* Open Packaging Conventions
* WordProcessingML (docx) part of Open XML
* Presentation ML (pptx) part of OpenXML
The library is designed to round trip docx files with 100% fidelity, and supports all 2007 WordML. Support for new Word 2010 features will be added soon.
The docx4j project is sponsored by Plutext (www.plutext.com ).
Is docx4j for you?
docx4j is for processing docx documents (and pptx presentations) in Java.
It isn't for old binary (.doc) files. For those, look at Apache POI's HWPF. (In fact, docx4j uses HWPF for basic conversion of .doc to .docx)
Nor is it for RTF files.
If you want to process docx documents on the .NET platform, you should look at Microsoft's OpenXML SDK instead.
An alternative to docx4j is Apache POI. I'd particularly recommend that for processing Excel documents. It can also be used to process Word documents, and since it uses XmlBeans (not JAXB) it may be a better choice if you want to use XmlBeans.
What sorts of things can you do with docx4j?
* Open existing docx (from filesystem, SMB/CIFS, WebDAV using VFS)
* Create new docx
* Programmatically manipulate the docx document (of course)
* Template substitution; CustomXML binding
* Import a binary doc (uses Apache POI's HWPF)
* Produce/consume Word 2007's xmlPackage (pkg) format
* Save docx to filesystem as a docx (ie zipped), or to JCR (unzipped)
* Apply transforms, including common filters
* Export as HTML or PDF
* Diff/compare documents, paragraphs or sdt (content controls)
* Font support (font substitution, and use of any fonts embedded in the document)
Projects using docx4j
Docx4all is a Swing-based word processor.
Plutext collaboration for Word 2007 uses docx4j on the server, to shred Word documents into smaller pieces which can be independently versioned.
Please contact Plutext if you would like your project to be listed here.
What Word documents does it support?
docx4j can read/write docx documents created by or for Word 2007, or earlier versions which have the compatibility pack installed.
The relevant parts of docx4j are generated from the ECMA schemas.
It can't read/write Word 2003 XML documents. The main problem with those is that the XML namespace is different.
docx4j will support Word 2010 docx files.
Using docx4j binaries
You can download the latest version of docx4j from http://dev.plutext.org/docx4j/
In general, we suggest you develop against a currently nightly build, since the latest formal release can often be several months old.
Supporting jars can be found in the .tar.gz version, or in the relevant subdirectory.
Using docx4j via Maven
Maven POM can be found at http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/m2/org/docx4j/docx4j
JDK versions
You need to be using Java 1.5+.
This is because of JAXB 1 . If you must use 1.4, retrotranslator can reportedly make it work.
A word about Jaxb
docx4j uses JAXB to marshall and unmarshall the key parts in a WordprocessingML document, including the main document part, the styles part, the theme part, and the properties parts.
JAXB is included in Sun's Java 6 distributions, but not 1.5. So if you are using the 1.5 JDK, you will need JAXB 2.1.x on your class path.
Bits of docx4j, such as org.docx4j.wml and org.docx4j.dml were generated using JAXB's XJC. We modified the wml.xsd schema in particular, so that the key resulting classes are a bit more human friendly (ie don't all start with CT_ and ST_).
Log4j
docx4j uses log4j for logging. To enable logging, you need a log4.properties or log4j.xml on your class path. See for example http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/src/main/resources/log4j.xml
Javadoc
Javadoc for browsing online or download, can be found in the directory http://dev.plutext.org/docx4j/
docx4j source code
To obtain a copy of the current source code:
svn co http://dev.plutext.org/svn/docx4j/trunk/docx4j docx4j
Alternatively, you can browse it online, at:
http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/
Building docx4j from source
Command line - Quick Instructions
"Quick" that is, provided you have maven and ant installed. Note that we only use maven to grab the dependencies, not to do the actual build.
Create a directory called workspace, and cd into it.
svn co http://dev.plutext.org/svn/docx4j/trunk/docx4j docx4j
open pom.xml, find the line which reads
<systemPath>/usr/lib/jvm/java-6-sun/jre/lib/rt.jar</systemPath>
and edit it to suit your system.
mvn install
ant dist
That ant command will create the docx4j.jar and place it and all its dependencies in the dist dir.
Eclipse
Prerequisites
* Eclipse installed
* Install an Eclipse subversion plugin eg http://subclipse.tigris.org/update_1.2.x
* Install Maven and the Eclipse plugin
And, as discussed above:
* Java 1.5 or 6
* JAXB: both the JAXB implementation included in Java 6, and the 2.x reference implementation. (This is the price of supporting either at runtime)
Instructions
* File > New "Project .." > SVN > Checkout Projects from SVN
* Create a new repository location; Url is http://dev.plutext.org/svn/docx4j
* Click folder "trunk", and select docx4j; click next
* You want to check it out as a project configured using the New Project Wizard
* Then select Java > Java Project; click Next
* Choose a project name (for example, 'docx4j') then click Next
* Click Finish (we'll define the Java build settings in a later step)
After a couple of other dialog boxes, you should have the new project in your workspace.
Now, we need to configure the class path etc within Eclipse so that it can build.
* Build Path > Configure Build Path > Java Build Path > Source tab
* Click on src, then press the remove button
* Then click "add folder" and navigate through to src/main/java and tick 'java'
* Then add src/svg, src/diffx and src/pptx4j/java as well
The Maven bit:
* Make sure you have Maven and its plugin installed - see Prerequisites above.
* Run mvn install in the docx4j dir from a command prompt (just in case)
* Right click on project > Maven 2 > Enable
The project should now be working in Eclipse without errors2 .
Open an existing docx document
org.docx4j.openpackaging.packages. WordprocessingMLPackage represents a docx document.
To load a document, all you have to do is:
WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));
That method can also load Flat OPC XML files.
You can then get the main document part (word/document.xml):
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
After that, you can manipulate its contents.
WordML concepts
To do anything much beyond this, you need to have an understanding of basic WordML concepts.
According to the Microsoft Open Packaging spec, each docx document is made up of a number of Part files, zipped up. A Part is usually XML, but might not be (an image part, for example, isn't).
An introduction to WordML is beyond the scope of this document. You can find a very readable introduction in 1st edition Part 3 (Primer) at http://www.ecma-international.org/publications/standards/Ecma-376.htm or http://www.ecma-international.org/news/TC45_current_work/TC45_available_docs.htm (a better link, since its not zipped up).
Jaxb: marshalling and unmarshalling
docx4j contains a class representing each part. For example, there is a MainDocumentPart class. XML parts inherit from JaxbXmlPart , which contains a member called jaxbElement. When you want to work with the contents of a part, you work with its jaxbElement.
When you open a docx document using docx4j, docx4j automatically unmarshals the contents of each XML part to a strongly-type Java object tree (the jaxbElement).
Similarly, if/when you tell docx4j to save these Java objects as a docx, docx4j automatically marshals the jaxbElement in each Part.
Sometimes you will want to marshal or unmarshal things yourself. The class org.docx4j.jaxb.Context defines all the JAXBContexts used in docx4j:
|
Jc |
org.docx4j.wml
|
|
jcThemePart |
org.docx4j.dml |
|
jcDocPropsCore |
org.docx4j.docProps.core org.docx4j.docProps.core.dc.elements org.docx4j.docProps.core.dc.terms |
|
jcDocPropsCustom |
org.docx4j.docProps.custom |
|
jcDocPropsExtended |
org.docx4j.docProps.extended |
|
jcXmlPackage |
org.docx4j.xmlPackage |
|
jcRelationships |
org.docx4j.relationships |
|
jcCustomXmlProperties |
org.docx4j.customXmlProperties |
|
jcContentTypes |
org.docx4j.openpackaging.contenttype |
|
jcPML |
org.docx4j.pml
|
Architecture
docx4j has 3 layers:
1.
org.docx4j.openpackaging
OpenPackaging handles things at the Open Packaging Conventions level: unzipping a docx into
WordprocessingMLPackage
and a set of objects inheriting from Part; allowing parts to be added/deleted; saving the docx
This layer is based originally on OpenXML4J (which is also used by Apache POI).
Parts are generally subclasses of
org.docx4j.openpackaging.parts.JaxbXmlPart
Parts are arranged in a tree. If a part has descendants, it will have a
org.docx4j.openpackaging.parts.relationships.RelationshipsPart
which identifies those descendant parts. The sample PartsList (see next section) shows you how this works.
A JaxbXmlPart has a content tree:
public Object getJaxbElement() {
return jaxbElement;
}
public void setJaxbElement(Object jaxbElement) {
this.jaxbElement = jaxbElement;
}
2.
The
jaxb
content tree
is the second level of the three layered model.
Most parts (including MainDocumentPart, styles, headers/footers, comments,
endnotes
/footnotes) use
org.docx4j.wml
(WordprocessingML);
wml
references
org.docx4j.dml
(DrawingML) as necessary.
These classes were generated from the Open XML schemas
3.
org.docx4j.model
This package builds on the lower two layers to provide extra functionality, and is being progressively further developed.
Samples
The package org.docx4j.samples contains examples of how to do things with docx4j. These include:
Basics
* CreateWordprocessingMLDocument
* DisplayMainDocumentPartXml
* OpenAndSaveRoundTripTest
* OpenMainDocumentAndTraverse
Output/Transformation
* CreateHtml
* CreatePdf
* ExportInPackageFormat
* ImportFromPackageFormat
* AddImage
* ConvertEmbeddedImageToLinked
Part Handling
* CopyPart
* ImportForeignPart
* PartsList
* StripParts
Miscellaneous
* CompareDocuments
* CreateDocxWithCustomXml
* CustomXmlBinding
* DocProps
* Filter
* HyperlinkTest
* NumberingRestart
* UnmarshallFromTemplate
If you installed the source code, you'll have this package already.
If you didn't, you can browse it online, at
http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/src/main/java/org/docx4j/samples
There are also various sample documents in the /sample-docs directory; these are most easily accessed by checking out docx4j svn.
Parts List
To get a better understanding of how docx4j works and the structure of a docx document you can run the PartsList sample on a docx (or a pptx). If you do, it will list the hierarchy of parts used in that package. It will tell you which class is used to represent each part, and where that part is a JaxbXmlPart, it will also tell you what class the jaxbElement is.
For example:
Part /_rels/.rels [org.docx4j.openpackaging.parts.relationships.RelationshipsPart]
containing JaxbElement:org.docx4j.relationships.Relationships
Part /docProps/app.xml [org.docx4j.openpackaging.parts.DocPropsExtendedPart]
containing JaxbElement:org.docx4j.docProps.extended.Properties
Part /docProps/core.xml [org.docx4j.openpackaging.parts.DocPropsCorePart]
containing JaxbElement:org.docx4j.docProps.core.CoreProperties
Part
/word/document.xml
[org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart]
containing JaxbElement:org.docx4j.wml.Document
Part /word/settings.xml [
org.docx4j.openpackaging.parts.WordprocessingML
.DocumentSettingsPart]
containing JaxbElement:org.docx4j.wml.CTSettings
Part /word/styles.xml [
org.docx4j.openpackaging.parts.WordprocessingML
.StyleDefinitionsPart]
containing JaxbElement:org.docx4j.wml.Styles
Part /word/media/image1.jpeg [ org.docx4j.openpackaging.parts.WordprocessingML .ImageJpegPart]
Traversing a docx
OpenMainDocumentAndTraverse.java in the samples directory shows you how to traverse the JAXB representation of a docx.
One annoying thing about JAXB, is that an object say a table could be represented as org.docx4j.wml.Tbl (as you would expect). Or it might be wrapped in a javax.xml.bind.JAXBElement, in which case to get the real table, you have to do something like:
if ( ((JAXBElement)o).getDeclaredType().getName().equals( "org.docx4j.wml.Tbl" ) )
org.docx4j.wml.Tbl tbl = (org.docx4j.wml.Tbl)((JAXBElement)o).getValue();
Creating a new docx
To create a new docx:
// Create the package
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
// Save it
wordMLPackage.save(new java.io.File("helloworld.docx") );
That's it.
createPackage() is a convenience method, which does:
// Create the package
WordprocessingMLPackage wordMLPackage = new WordprocessingMLPackage();
// Create the main document part (word/document.xml)
MainDocumentPart wordDocumentPart = new MainDocumentPart();
// Create main document part content
ObjectFactory factory = Context.getWmlObjectFactory();
org.docx4j.wml.Body body = factory .createBody();
org.docx4j.wml.Document wmlDocumentEl = factory .createDocument();
wmlDocumentEl.setBody(body);
// Put the content in the part
wordDocumentPart.setJaxbElement(wmlDocumentEl);
// Add the main document part to the package relationships
// (creating it if necessary)
wmlPack.addTargetPart(wordDocumentPart);
Adding a paragraph of text
MainDocumentPart contains a method:
public org.docx4j.wml.P addStyledParagraphOfText(String styleId, String text)
You can use that method to add a paragraph using the specified style.
The XML we are looking to create will be something like:
<
w:p
xmlns:w
="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
>
<
w:r
>
<
w:t
>
Hello world
</
w:t
>
</
w:r
>
</
w:p
>
addStyledParagraphOfText builds the object structure the JAXB way , and adds it to the document.
ObjectFactory factory = Context.getWmlObjectFactory();
// Create the paragraph
org.docx4j.wml.P para = factory.createP();
// Create the text element
org.docx4j.wml.Text t = factory.createText();
t.setValue(simpleText);
// Create the run
org.docx4j.wml.R run = factory.createR();
run.getRunContent().add(t);
para.getParagraphContent().add(run);
// Now add our paragraph to the document body
Body body = this.jaxbElement.getBody();
Body.getEGBlockLevelElts().add(para)
Alternatively, you can create the paragraph by marshalling XML:
// Assuming String xml contains the XML above
org.docx4j.wml.P para = XmlUtils.unmarshalString(xml);
For this to work, you need to ensure that all namespaces are declared properly in the string.
Adding a Part
What if you wanted to add a new styles part? Here's how:
// Create a styles part
StyleDefinitionsPart stylesPart = new StyleDefinitionsPart();
// Populate it with default styles
stylesPart.unmarshalDefaultStyles();
// Add the styles part to the main document part relationships
wordDocumentPart.addTargetPart(stylesPart);
You'd take the same approach to add a header or footer.
When you add a part this way, it is automatically added to the source part's relationships part.
Generally, you'll also need to add a reference to the part (using its relationship id) to the Main Document Part. This applies to images, headers and footers. (Comments, footnotes and endnotes are a bit different, in that what you add to the main document part are references to individual comments/footnotes/endnotes).
docx to (X)HTML
docx4j uses XSLT to transform a docx to XHTML:
AbstractHtmlExporter exporter = new HtmlExporterNG2();
// note the *2* there
// Write to StreamResult (in this case, an output stream)
OutputStream os = new java.io.FileOutputStream(inputfilepath + ".html" );
javax.xml.transform.stream.StreamResult result
=
new
javax.xml.transform.stream.StreamResult(os);
exporter.html(wordMLPackage, result,
inputfilepath + "_files" );
You will find the generated HTML is clean.
docx4j uses Java XSLT extension functions to do the heavy lifting, so the XSLT itself is kept simple.
docx to PDF
docx4j produces XSL FO, which can in turn be used to create a PDF.
At present, Apache FOP is integrated into docx4j for creating the PDF. (Soon, we will be changing things so that docx4j generates FO, for use by your preferred FO renderer, whether that's FOP, or a commercial tool such as XEP).
To create a PDF:
// Fonts identity mapping best on Microsoft Windows
wordMLPackage.setFontMapper( new IdentityPlusMapper());
// Set up converter
org.docx4j.convert.out.pdf.PdfConversion c
=
new
org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage);
// Write to output stream
OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf" );
c.output(os);
Image Handling
When you add an image to a document in Word 2007, it is generally added as a new Part (ie you'll find a part in the resulting docx, containing the image in base 64 format).
When you open the document in docx4j, docx4j will create an image part representing it.
It is also possible to create a linked image. In this case, the image is not embedded in the docx package, but rather, is referenced at its external location.
docx4j's BinaryPartAbstractImage class contains methods to allow you to create both embedded and linked images (along with appropriate relationships).
/**
* Create an image part from the provided byte array, attach it to the
* main document part, and return it.*/
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage wordMLPackage,
byte [] bytes)
/**
* Create an image part from the provided byte array, attach it to the source part
* (eg the main document part, a header part etc), and return it.*/
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage wordMLPackage,
Part sourcePart, byte [] bytes)
/**
* Create a linked image part, and attach it as a rel of the specified source part
* (eg a header part) */
public static
BinaryPartAbstractImage createLinkedImagePart(
WordprocessingMLPackage wordMLPackage, Part sourcePart, String fileurl)
For an image to appear in the document, there also needs to be appropriate XML in the main document part. This XML can take 2 basic forms:
* the Word 2007 w:drawing form
<w:p>
<w:r>
<w:drawing>
<wp:inline distT ="0" distB ="0" distL ="0" distR ="0" >
<wp:extent cx ="3238500" cy ="2362200" / >
<wp:effectExtent l ="19050" t ="0" r ="0" b ="0" / >
:
<a:graphic >
<a:graphicData .. >
<pic:pic >
:
<pic:blipFill>
< a:blip r:embed ="rId5" / >
:
< / pic:blipFill>
:
< / pic:pic>
< / a:graphicData>
< / a:graphic>
< / wp:inline>
< / w:drawing>
< / w:r>
< / w:p>
* the Word 2003 VML-based w:pict form
<w:p>
<w:r>
<w:pict>
<v:shapetype id ="_x0000_t75" coordsize ="21600,21600" .. >
<v:stroke joinstyle ="miter" / >
<v:formulas>
:
< / v:formulas>
:
< / v:shapetype>
<v:shape .. style ="width:428.25pt;height:321pt" >
< v:imagedata r:id ="rId4" o:title ="" / >
< / v:shape>
< / w:pict>
< / w:r>
< / w:p>
docx4j can create the Word 2007 w:drawing/wp:inline form for you:
/**
* Create a <wp:inline> element suitable for this image,
* which can be linked or embedded in w:p/w:r/w:drawing.
* If the image is wider than the page, it will be scaled
* automatically. See Javadoc for other signatures.
* @param filenameHint Any text, for example the original filename
* @param altText Like HTML's alt text
* @param id1 An id unique in the document
* @param id2 Another id unique in the document
* @param link true if this is to be linked not embedded */
public Inline createImageInline(String filenameHint, String altText,
int id1, int id2, boolean link)
which you can then add to a w:r/w:drawing.
Finally, with docx4j, you can convert images from formats unsupported by Word (eg PDF), to PNG, which is a supported format. For this, docx4j uses ImageMagick. So if you want to use this feature, you need to install ImageMagick. docx4j invokes ImageMagick using:
Process p = Runtime.getRuntime().exec(
"imconvert -density "
+ density +
" -units PixelsPerInch - png:-"
);
Note the name imconvert , which is used so that we don't have to supply a full path to exec. You'll need to accommodate that.
Text extraction
A quick way to extract the text from a docx, is to use TextUtils
public static void extractText(Object o, Writer w)
which marshals the object it is passed via a SAX ContentHandler, in order to output the text to the Writer.
Text substitution
Text substitution is easy enough, provided the string you are searching for is represented in a org.docx4j.wml.Text object in the form you expect.
However, that won't necessarily be the case. The string could be broken across text runs for any of the following reasons:
* part of the word is formatted differently (eg in bold)
* spelling/grammar
* editing order (rsid)
docx4j will eventually accommodate these cases, but doesn't right now.
Subject to that, you can do text substitution in a variety of ways, for example:
* traversing the main document part, and looking at the org.docx4j.wml.Text objects
* marshal to a string, search/replace in that, then unmarshall again
docx4j s XmlUtils also contains:
/**
* Give a string of wml containing ${key1}, ${key2}, return a suitable
* object.*/
public static Object unmarshallFromTemplate(String wmlTemplateString,
java.util.HashMap<String, String> mappings)
See the UnmarshallFromTemplate example, which operates on a string containing:
<w:p>
<w:r>
<w:t> My favourite colour is ${colour} . < / w:t>
< / w:r>
< / w:p>
<w:p / >
<w:p>
<w:r>
<w:t> My favourite ice cream is ${icecream} . < / w:t>
< / w:r>
< / w:p>
Tips and Tricks
Work with the Flat OPC XML Format
When you want to look inside a docx document, it's a bit of a pain to have to unzip it to look at the relevant part.
There are 2 ways around this.
One is http://www.codeplex.com/PackageExplorer , which can unzip the docx, and pretty print a part.
Another is to save the docx as Word XML document (*.xml) . This produces a single XML file, which you can open in an XML editor such as XPontus.
docx4j can open Flat OPC XML files, and save to them.
To open a Flat OPC XML file:
WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));
To save as Flat OPC XML:
wordMLPackage.save(new java.io.File(outputfilepath));
In both cases, the Flat OPC code will be used if and only if the file extension is .xml .
Remember UnmarshalFromString
When you are manipulating docx documents, it is often useful to unmarshal snippets of XML (eg a String representing a paragraph to be inserted into the document).
For example, given:
<
w:p
xmlns:w
="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
>
<
w:r
>
<
w:t
>
Hello world
</
w:t
>
</
w:r
>
</
w:p
>
you can simply:
// Assuming String xml contains the XML above
org.docx4j.wml.P para = XmlUtils.unmarshalString(xml);
Cloning
To clone a JAXB object, use one of the following methods in XmlUtils:
/** Clone this JAXB object, using default JAXBContext. */
public static <T> T deepCopy(T value)
/** Clone this JAXB object */
public static <T> T deepCopy(T value, JAXBContext jc)
@XmlRootElement
Most commonly used objects have an @XmlRootElement annotation, so they can be marshalled and unmarshalled.
In some cases, you might find this annotation is missing.
If you can't add the annotation to the jaxb source code, an alternative is to marshall it using code which is explicit about the resulting QName. For example, XmlUtils contains:
/** Marshal to a W3C document, for object
* missing an @XmlRootElement annotation. */
public static
org.w3c.dom.Document marshaltoW3CDomDocument(Object o, JAXBContext jc,
String uri, String local, Class declaredType)
You could use this like so:
CTFootnotes footnotes =
wmlPackage.getMainDocumentPart().getFootnotesPart().getJaxbElement().getValue();
CTFtnEdn ftn = footnotes.getFootnote().get(1);
// No @XmlRootElement on CTFtnEdn, so ..
Document d = XmlUtils.marshaltoW3CDomDocument( ftn,
Context.jc, Namespaces.NS_WORD12, "footnote" , CTFtnEdn. class );
If you need to unmarshal, you can use:
public static Object unmarshalString(String str, JAXBContext jc, Class declaredType)
The docx4j forum
Free community support is available in the docx4j forum, at http://dev.plutext.org/forums/
This discussion is generally in English. If you can volunteer to moderate a forum in your language, please let us know.
Other Support Options
If the free community support available in the docx4j forum does not meet your needs, or you simply want to outsource some coding, you are welcome to purchase programming, consulting and priority support from http://www.plutext.com/m/index.php/docx4j-support.html
By purchasing services from Plutext, you support the continued development of docx4j.
Roadmap
Word 2010 support. Support for the new XML elements/schemas introduced with Word 2010, and for the compatibility mechanism. This is the main justification for the 3.0 label.
HTML exporters: get rid of old ones; standardise on NG2. The idea is to remove any 'which should I use' confusion, and focus effort/know-how.
PDF exporters: standardise on viaXSLFO, and get rid of viaIText and viaHTML. As with HTML, the idea is to remove any 'which should I use' confusion, and focus effort/know-how. docx4j could produce XSL FO only, and rely on the user to have FOP or equivalent to actually produce the PDF. This will reduce dependencies, making docx4j lighter. The goal would be to remove the fop jar (2.8M), PDF renderer jar (1.6M), iText jar (1.1M), and core-renderer (1M).
Font handling: remove the panose stuff, so we don't need a customised FOP jar.
Layout model/intermediate format: docx4j contains a DocumentModel, which could be further developed to support:
* Search/replace
* Estimating page content
* XSLT, by enclosing sections, lists
Inserting OLE objects: so spreadsheets, PDFs etc can be embedded.
Colophon
This document was written in Word 2007, using:
* XML pretty printed using http://www.softlion.com/webTools/XmlPrettyPrint/default.aspx or Package Explorer
* Java source code formatted using http://www.java2html.de
The PDF and HTML versions were generated using docx4j (PDF via XSL FO and FOP).
Contacting Plutext
Unless you have paid for support, general How do I type questions should be posted directly to the docx4j forum . Plutext may post to the forum any questions it receives by email which should have been directed to the forum.
Plutext can be contacted at either<EMAIL_ADDRESS>, or<EMAIL_ADDRESS>1 http://forums.java.net/jive/thread.jspa?threadID=411
2 If you get the error 'Access restriction: The type is not accessible due to restriction on required library rt.jar' (perhaps using some combination of Eclipse 3.4 and/or JDK 6 update 10?), you need to go into the Build Path for the project, Libraries tab, select the JRE System Library, and add an access rule, "Accessible, **".


James Anderson Likely To Make A Comeback Against South Africa
Anderson, who has played in 149 Tests for England, has scalped 575 wickets averaging 26.94.
England pacer James Anderson, who did not feature in the national side owing to a calf strain during the first Ashes Test at Edgbaston in August this year, is likely to make a comeback when the Three Lions tours South Africa.
Anderson had left the field after bowling just four overs during the Ashes opener against Australia and will also miss England’s two Test series against New Zealand, starting November 22 in Mount.
The 37-year-old will now join a training camp in Potchefstroom, and if cleared, will feature in the first of the four Tests against the Proteas.
“Jimmy is going out to Potchefstroom,” Ashley Giles, the managing director of England’s men’s cricket, was quoted as saying by the BBC.
“We’re hopeful. We think he is on track, which is great. The medical team are happy. The older you get, these things linger longer. We felt no point forcing it for this short tour,” he added.
“It will be interesting to see the pitches we play on in South Africa. I think they’ll be green, and they’ll go for a bowler war and take us on. It’s not something I’d take on with Jofra Archer and Jimmy Anderson, but it will be an exciting series,” Giles expressed.
Anderson, who has played in 149 Tests for England, has scalped 575 wickets averaging 26.94.
For breaking news and live news updates, like us on Facebook or follow us on Twitter and Instagram. Read more on Cricket Latest News on India.com.
Story Timeline
- 16 Nov 2019 James Anderson Likely To Make A Comeback Against South Africa...
- 16 Nov 2019 No, Can’t Have Him in The Squad: Ben Stokes on Alex Hales Before World Cup...
- 14 Nov 2019 Warner Wouldn t Just Shut Up: Stokes Reveals How Australian Planned to Disrupt His Game in Ashes Test
- 12 Nov 2019 Great Selection Headache to Have: England Coach Chris Silverwood Welcomes Dawid Malan’s Performance...
Comments - Join the Discussion


Phone:<PHONE_NUMBER> | Email<EMAIL_ADDRESS>| Dallas, TX 75220 LinkedIn: /MirrorlessMind | Portfolio: Current Work | GitHub: Cigi Tipton
Web Developer with SMU full stack certification in Javascript, CSS, React, Agile Principles, GitHub and Responsive Web Design. Combining passion for technology, design and art disciplines to bring more dynamic experience to team or individual projects.
PodShack | GitHub Code: mirrorlessmind/PodShack | Deployed: Pod Shack
Summary: Responsive App to Assist Users to Find Podcasts
Role: Co-Author
Tools: HTML, CSS, JavaScript, Bootstrap, Photoshop, Passport, JQuery, Handlebars, Express
Beautiful Day | GitHub Code: mirrorlessmind/BeautifulDay | Deployed: Beautiful Day
Summary: Weather app that provides current and future weather forecasts in cities.
Role: Sole author
Tools: HTML, CSS, JavaScript, jQuery, API, Bootstrap, Font Awesome, Photoshop
Renewing my passion for visual storytelling encouraged met to create a company providing artistic, approachable photography/videography for corporate branding, events and weddings:
Created branding materials: PETA Dallas, TGIFridays, Dallas Mayor Office, etc
Before Covid advanced 5 co-artists to begin their own companies.
Won 4 awards from Society of Wedding Professionals.
Voted To the Board as Social Media Manager for the Society of Wedding Professionals
During the 9 years at McCarthy, I served in several capacities/titles due to always learning new technologies and advancing my potential. Eventually becoming a liaison between management, creative sales and IT.
Key Accomplishments:
Determined digital storage needs for backup and remote access for the media
Co-created an award winning stop-motion commercial for North Texas Honda.
Streamlined data flow between the CRM systems within departments.
Create training guides and procedures for several key positions within the company.
Trained new employees on the CRM systems and procedures


= 'lead'
word print(word[0])
print(word[1])
print(word[2])
print(word[3])
l
e
a
d
for
loop and the while
looprange()
for
loops repeat code for each element in a collectionwhile
loops repeat code until a condition changesTo do that, we’ll have to teach the computer how to repeat things.
An example task that we might want to repeat is printing each character in a word on a line of its own.
We can access a character in a string using its index. For example, we can get the first character of the word 'lead'
, by using word[0]
. One way to print each character is to use four print
statements:
= 'lead'
word print(word[0])
print(word[1])
print(word[2])
print(word[3])
l
e
a
d
This is a bad approach for two reasons:
= 'tin'
word print(word[0])
print(word[1])
print(word[2])
print(word[3])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-3-7974b6cdaf14> in <module>()
3 print(word[1])
4 print(word[2])
----> 5 print(word[3])
IndexError: string index out of range
Instead we can use a loop - a construct that moves through a collection of data taking one bit at a time. Here’s a loop in action
= 'lead'
word for char in word:
print(char)
l
e
a
d
This is shorter, certainly shorter than something that prints every character in a hundred-letter string and more robust as well. Note the indentation rules apply in the for
loop.
Also, see how the same code works if we change the length of the word
= 'oxygen'
word for char in word:
print(char)
o
x
y
g
e
n
The improved version uses a for loop to repeat code in this case print()
, once for each thing in a sequence. The general form of a loop is:
Using the oxygen example above, the loop might look like this:
where each character (char
) in the variable word
is looped through and printed one character after another. The numbers in the diagram denote which loop cycle the character was printed in (1 being the first loop, and 6 being the final loop).
We can call the loop variable anything we like, but there must be a colon at the end of the line starting the loop, and we must indent anything we want to run inside the loop. Unlike many other languages, there is no command to signify the end of the loop body (e.g. end for
); what is indented after the for
statement belongs to the loop.
In the example above, the loop variable was given the name char
as a mnemonic; it is short for ‘character’. We can choose any name we want for variables. We might just as easily have chosen the name banana
for the loop variable, as long as we use the same name when we invoke the variable inside
= 'oxygen'
word for banana in word:
print(banana)
o
x
y
g
e
n
It is a good idea to choose variable names that are meaningful, otherwise it would be more difficult to understand what the loop is doing.
Here’s another loop that repeatedly updates a variable:
= 0
length for vowel in 'aeiou':
= length + 1
length print('There are', length, 'vowels')
There are 5 vowels
It’s worth tracing the execution of this little program step by step.Since there are five characters in 'aeiou'
, the statement on line 3 will be executed five times. The first time around,length
is zero (the value assigned to it on line 1) and vowel
is 'a'
.
The statement adds 1 to the old value of length
, producing 1, and updates length
to refer to that new value.
The next time around,vowel
is 'e'
and length
is 1, so length
is updated to be 2. After three more updates, length
is 5; since there is nothing left in 'aeiou'
for Python to process, the loop finishes and the print
statement on line 4 tells us our final answer.
Note that a loop variable is just a variable that’s being used to record progress in a loop. It still exists after the loop is over, and we can re-use variables that were previously defined as loop variables:
= 'z'
letter for letter in 'abc':
print(letter)
print('after the loop, letter is', letter)
a
b
c
after the loop, letter is c
This means your loop variable should ideally not be something you intend to use elsewhere.
Note also that finding the length of a string is such a common operation that Python actually has a built-in function to do it called len
:
print(len('aeiou'))
5
Looping over a Python list is very common. The syntax is identical.
= [1,2, 'three', 'IV', 5.0 ]
numbers_and_letters
for item in numbers_and_letters:
print(item)
1
2
three
IV
5.0
What if we don’t want to do every item in a collection, or if we want to do something a set number of times? We can create a collection that has the things we need.
Python has a built-in function called range()
that creates a sequence of numbers. range()
can accept 1, 2, or 3 parameters.
range
creates an array of that length, starting at zero and incrementing by 1. For example, range(3)
produces the numbers 0, 1, 2
.range
starts at the first and ends just before the second, incrementing by one. For example, range(2, 5)
produces 2, 3, 4
.range
is given 3 parameters, it starts at the first one, ends just before the second one, and goes up in steps of the third one. For example range(3, 10, 2)
produces 3, 5, 7, 9
.You can loop over the keys in the dictionary in the same way as for the list, explicitly accessing the value using the key.
= {'x': 1, 'y': 2, 'z': 3}
d
for key in d:
print(key, 'has value', d[key])
x has value 1
y has value 2
z has value 3
Note that as dicts are intrinsically disordered, unlike lists the order they will be accessed in this way is arbitrary. If you care about order you can make a list of the keys using the keys()
method and loop over that instead. Here we make a list of keys and sort it, then loop over the sorted key. Note the difference in the result to that above.
= {'x': 1, 'y': 2, 'z': 3}
d
= sorted(d.keys())
frozen_keys
for key in frozen_keys:
print(key, 'has value', d[key])
x has value 1
y has value 2
z has value 3
Python can also be made to give you the key - value pairs if you want them, so you don’t need to explicitly get the value each time. For this we use the .items()
method and two loop variables. The first loop variable gets the key, the second the value.
= {'x': 1, 'y': 2, 'z': 3}
d
for key, value in d.items():
print(key, 'has value', value)
x has value 1
y has value 2
z has value 3
A different sort of loop is the while
loop. This loop repeats while something is in some state - usually the True
state.
= 1
i while i < 6:
print(i)
+= 1 i
1
2
3
4
5
The while
loop is somewhat rare in Python, but does get used from time to time.
Using range
, write a loop to print the first 3 positive integers.
Exponentiation is built into Python, \(3 ^ 2\) would be 3 ** 2
. Write a loop that calculates the same result as 5 ** 3
using multiplication (and without exponentiation).
print(5 ** 3)
125
Knowing that two strings can be concatenated using the +
operator, write a loop that takes a string and produces a new string with the characters in reverse order, so 'Newton'
becomes 'notweN'
.
The built-in function enumerate()
takes a sequence (e.g. a list) and generates a new sequence of the same length. Each element of the new sequence is a pair composed of the index (0, 1, 2,…) and the value from the original sequence:
= ['apple', 'banana', 'grapes', 'pear']
fruits for position, name in enumerate(fruits):
print("The ", position, "fruit is ", name)
The 0 fruit is apple
The 1 fruit is banana
The 2 fruit is grapes
The 3 fruit is pear
The function shuffle()
in the random
package rearranges a list in place (meaning it changes the original object, so you don’t have to use a fresh variable name. Use the enumerate()
and random.shuffle()
to mix up the list below and work out where the digit 100 appears in the list.
= list(range(1000) ) big_numbers


Simple reports can be produced by navigating to URLs of the format /#/analyse/modelname - see example here.
More useful reports can be run by passing an aggregation
pipeline
to the server using the format /#/analyse/model?r=[pipeline] - for example
/#/analyse/g_conditional_fields?r=[{"$group":{"_id":"$sex","count":{"$sum":1}}}]
produces a breakdown of the men and women in a collection.
Reports can be enhanced by passing an object containing the pipeline as a property, along with a number of
options:
- title this option allows a title to be specified. The default is the model name.
- columnDefs an array of column instruction objects which determines the output order and
appearance.
For full details see the ng-grid
documentation
but the most common uses are:
- field the name of the field in the model.
- displayName (optional) the column heading.
- width (optional) the desired display width.
- align (optional - default left) the desired text alignment. If present must be one
of left, right, centre, center.
- cellClass (optional) a CSS class to be added to the cell.
- cellFilter (optional) an Angular filter (such as number or
currency to be applied to the value.
- totalsRow (optional - an extension to ng-grid) a text value
(generally "Total") or $SUM
- columnTranslations an array of objects giving instructions for translating returned data.
The objects are made up as follows:
- field (mandatory) the name of the results column to translate
- fn a function(row,callback) which modifies a row of the results set and then calls the callback.
There is an example in this file (search for "functiondemo")
- translations an array of value→display mappings, such as [{value:'M',
display:'Male'},{value:'F', display:'Female'}]
- ref the name of a Mongoose model to use to look up the current value against
(returning a concatenation of the fields with a truthy list key)
If there is more than one of fn, translations and ref they are performed in that order.
- drilldown a url that clicking on the row will navigate to. A |fieldname| will be replaced
with the value of the fieldname in the current row. For example a report
listing one row per item might have a drilldown of model/|_id|/edit as seen in this report.
- params contains an array of parameters that can be used in the pipeline, normally in a
$match such as {$match:{sex:("sex")}}. Parameters can have the following properties:
Use of date parameters is quite tricky. The following works (quotes omitted for clarity):
reportSchema = {
pipeline: [
{ '$match': {$and : [{birth : {$lt:"(periodFinish)"}},{birth : {$gt:"(periodStart)"}}]}},
{$group:{_id:'People',count:{$sum:1}}
],
params: {
periodStart: {value: "1800-01-01T00:00:00.000Z", type: 'text', add: 'ui-date ui-date-format ', conversionExpression: "param | date:'yyyy-MM-ddThh:mm:ss.sssZ'"},
periodFinish: {value: "2099-01-01T00:00:00.000Z", type: 'text', add: 'ui-date ui-date-format ', conversionExpression: "param | date:'yyyy-MM-ddThh:mm:ss.sssZ'"}
}
};
Using these options the report above can be tidied
up.
If you looked at the link to that last report you would have realised that using the URL to specify a report
format
quickly becomes unmanageable. A neater alternative is to put the options into an object which is served up via a
static in the model file - see here for
some
examples.


George is a cute capybara. He loves cuddles and peanut butter. He is 3 years old.
Spencer is a feisty fennec fox. He loves listening to things with his huge ears. He is 6 months old.
Pauly is a pretty parrot. He likes to squawk and poop on things. He is 5 years old.
  He is 2 years old.
Alexis is a stinky but fun goat. She enjoys eating anything you put near her face, including your fingers or clothes.


Jorge Lainfiesta
Multi-disciplinary software engineer based in Copenhagen
In a world where business, media, and society are rapidly converging with technology, firms must continuously grow with all the factors at hand. By taking a holistic approach to technology, I advise software-centered organizations on how to develop effective communication strategies.
Let's find opportunities for your organization
<EMAIL_ADDRESS>-
10 years contributing to increasingly complex user interfaces on the web, working as software engineer, consultant, and trainer.
-
Master studies in communication from renowned univerities, including UCLA in America and AAU CPH in Europe.
-
Multicultural experiences, having lived in six countries in three continents and worked in corporate, startup and academic environments.


GITHUB !!
Learned enough to host a simple website!
Top Nav Bar
viewport sensitive, for mobile devices.
'favicon.ico'
Custom icon on broswer tab!
Bottom Navigation
Rendered using Javascript
This Website's Pages
- About ME: Venture into the personal.
- Simple ITEM ORDER at Yummy Cafe, Homework, TODO: error check the item entered.
- Quotes Generator, An AJAX Lab on ZBooks that was quite inspi-rational.
- F° / C°: The temperature image changes too! Easy be customised and extended, so fun.
- Weather AJAX, Homework! API's are SO GREAT, to reach out and contact other website entities... wow! SEE: HOLIDAYS. ***BROKEN BY HTTPS***
- Holiday AJAX, API Practice, to complement the WEATHER AJAX above, by trying to wrangle a "wild" AJAX API object. Complicated -- but success was had! Unfortunately the dumb API will only give holidays for LAST YEAR with the free version, which is frustrating.
- Number Fun, Note that it changes every time the input field changes, without waiting to press 'enter.' ***BROKEN BY HTTPS***


The SubModel object is the basis for the implementation of sub-models in JaamSim. The components of SubModel are displayed in a Region that is created as part of the SubModel object. A component is added to the SubModel by dragging and dropping it on top of its Region or by copying and pasting an existing object on top of the Region.
A component has both a local name with the context of its SubModel as well as a global name. For example, a component with the local name Server1 within SubModelA has a global name of SubModelA.Server1. The SubModel that contains a component is called the parent SubModel of the component.
The keyword 'sub' in an expression refers to the parent SubModel. It is equivalent to entering 'this.parent'.
A SubModel can contain another SubModel as a component. For example, if Server1 is component of SubModelA which in turn is a component of SubModelB, then the global name for Server1 is SubModelB.SubModelA.Server1.
A SubModel's Region can be displayed or hidden temporarily using the 'Show SubModels' button, or it can be displayed or hidden permanently using the 'Show Components' item in its context menu (right click).
A SubModel can receive entities as part of a process flow type model or it can operate independently. A SubModel uses its SubModelStart and SubModelEnd components specify the entry and exit points for entities that arrive to and depart from the SubModel. An entity arriving to a SubModel is directed automatically to its SubModelStart component. An entity arriving to a SubModelEnd component is directed automatically back to the parent SubModel and from there to the object specified by its NextComponent input. An entity can be sent directly to any other object by providing an input to the NextComponent input to the SubModelEnd object. A SubModel that receives entities must have a single SubModelStart object as a component, but can have multiple SubModelEnd components.
When a SubModel is created, it automatically appears in the Model Builder under the 'Pre-built SubModels' heading and can be dragged and dropped in the same way as any other object in the Model Builder. However, when a SubModel is dragged and dropped, a new type of object called a 'SubModelClone' is created. This object behaves in the same way as a copy of the SubModel, but has the important additional property that it can be updated to be consistent with any changes that have been made to the original ('prototype') SubModel. The update is performed automatically when a model is started or it can be performed manually by selecting 'Update Clones' from the context menu (right-click) for the original SubModel.
A SubModel object can also be copied in the same way as other objects. The SubModel’s components and their inputs are copied along with the SubModel. Inputs to SubModel components that reference the parent SubModel or another component of the SubModel are changed automatically to refer to the copied SubModel or SubModel component. RandomSeed inputs to probability distributions are changed to the first unused integer value. However, unlike a SubModelClone, a copied SubModel must be updated manually if the original SubModel is modified.
The KeywordList input provides a way to define new inputs for a SubModel. Each of these inputs accepts an expression that returns a number with or without units. An output with the same name as the input is created to return the present value for the input expression. This feature allows a component of the SubModel to obtain all its inputs through its parent SubModel or from other components of the SubModel, thereby avoiding any references to objects outside of the SubModel. The inputs and outputs created by the KeywordList input are retained by any SubModelClones that were created by dragging and dropping the SubModel.
SubModel Inputs
|
Keyword |
Description |
|
Key Inputs |
|
|
Description |
A free-form string describing the object. |
|
NextComponent |
The next object to which the processed entity is passed. |
|
User-defined inputs |
Inputs defined by the user through the KeywordList input. |
|
Options |
|
|
AttributeDefinitionList, CustomOutputList |
See Section 6.2. |
|
KeywordList |
Defines new keywords for the sub-model and creates new outputs with the same names. This allows the components of a sub-model to receive all their inputs from either the parent sub-model or from other components. |
|
Graphics |
|
|
Position, Alignment, Size, Orientation, Region, RelativeEntity, DisplayModel, Show, Movable, VisibleViews, DrawRange |
See Section 11.1. |
SubModel Outputs
|
Output Name |
Description |
|
Entity and DisplayEntity |
|
|
Name, ObjectType, SimTime, Parent, Position, Size, Orientation, Alignment, GraphicalLength, ObserverList, NextList, PreviousList, EntityReferenceList |
See Section 11.1. |
|
StateEntity |
|
|
State, WorkingState, WorkingTime, StateTimes, TotalTime |
See Section 10.3. |
|
LinkedComponent |
|
|
obj, NumberAdded, NumberProcessed, NumberInProgress, ProcessingRate, ReleaseTime |
See Section 16. |
|
SubModel |
|
|
User-defined outputs |
Outputs defined by the user through the KeywordList input. |
|
User-defined attributes and custom outputs |
As defined by the AttributeDefinitionList and CustomOutputList inputs. |


Gadgets in .NET
System.Configuration.Install.AssemblyInstaller - set_Path
- Execute payload on local assembly load
System.Activities.Presentation.WorkflowDesigner - set_PropertyInspectorFontAndColorData
- Arbitrary XAML load
- Requires Single Threaded Apartment (STA) thread
System.Windows.ResourceDictionary - set_Source
- Arbitrary XAML load
- Required to be able to work with setters of types derived from IDictionary
System.Windows.Data.ObjectDataProvider - set_(MethodName | ObjectInstance | ObjectType)
- Arbitrary Method Invocation
WhiteBox Review
Search the source code for the following terms:
TypeNameHandling
JavaScriptTypeResolver
Look for any serializers where the type is set by a user controlled variable.
BlackBox Review
Search for the following base64 encoded content that starts with:
AAEAAAD/////
Search for content with the following text:
TypeObject
$type:
General Precautions
Don't allow the datastream to define the type of object that the stream will be deserialized to. You can prevent this by for example using the DataContractSerializer or XmlSerializer if at all possible.
Where JSON.Net is being used make sure the TypeNameHandling is only set to None.
TypeNameHandling = TypeNameHandling.None
If JavaScriptSerializer is to be used then do not use it with a JavaScriptTypeResolver.
If you must deserialise data streams that define their own type, then restrict the types that are allowed to be deserialized. One should be aware that this is still risky as many native .Net types potentially dangerous in themselves. e.g.
System.IO.FileInfo
FileInfo objects that reference files actually on the server can when deserialized, change the properties of those files e.g. to read-only, creating a potential denial of service attack.
Even if you have limited the types that can be deserialised remember that some types have properties that are risky. System.ComponentModel.DataAnnotations.ValidationException, for example has a property Value of type Object. if this type is the type allowed for deserialization then an attacker can set the Value property to any object type they choose.
Attackers should be prevented from steering the type that will be instantiated. If this is possible then even DataContractSerializer or XmlSerializer can be subverted e.g.
// Action below is dangerous if the attacker can change the data in the database
var typename = GetTransactionTypeFromDatabase();
var serializer = new DataContractJsonSerializer(Type.GetType(typename));
var obj = serializer.ReadObject(ms);
Execution can occur within certain .Net types during deserialization. Creating a control such as the one shown below is ineffective.
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);
//Check below is too late! Execution may have already occurred.
if (suspectObject is SomeDangerousObjectType)
{
//generate warnings and dispose of suspectObject
}
For BinaryFormatter and JSON.Net it is possible to create a safer form of white list control useing a custom SerializationBinder.
Try to keep up-to-date on known .Net insecure deserialization gadgets and pay special attention where such types can be created by your deserialization processes. A deserializer can only instantiate types that it knows about.
Try to keep any code that might create potential gagdets separate from any code that has internet connectivity. As an example System.Windows.Data.ObjectDataProvider used in WPF applications is a known gadget that allows arbitrary method invocation. It would be risky to have this a reference to this assembly in a REST service project that deserializes untrusted data.


Saw you for the first time in two years, when I finally felt like I moved on, There you were, still as beautiful as you were on day 1.
One thing I couldn’t believe was this time you weren’t across the hallway, You were right next to me, laying your head on my shoulder, as we strolled around the town.
Prayed to the lord, for this moment to never end, You stopped me and took a few steps forward without me, I felt it all again,
It was you, leaving, again
But surprisingly this time, you turned around and asked me to close my eyes, Just to remind me of the distance when I woke up from this dream.
Here I am back to where it all started,
When I finally felt it’s all over,
You just gave me a new memory of how your touch used to feel right around my shoulder.
Strangers. Friends. Best friends. Friends. Strangers.
My mistake : Falling for you
Your mistake : Letting me fall for you
After everything ended for the nth time, I closed the door. I made my decision, finally. Promised myself to never open it.
6 months later and here you are, starting it all over with a “hey”. It hurts to say no. Hurts to open the door. Kept myself strong enough to not open that door.
Constant battles within me. And I finally did it.
Left the door open, not for you to just come in. But to come and leave me in pieces,
Like always.


Let Rebate Bus take you to SCHOOL ON SAVING MONEY FOOL
Call YO MAMMA!
Call THE POLICE
these motherfuckas bright
Buy Now!


XML and Web Service
@tenosiswono
EXtensible Markup Language
What is XML ?
- Specification for creating custom markup languages.
- W3C Recomendation.
- Primary purpose is to help computers to share data.
- Meta-Language, for creating other languages.
XML Document
- Every XML is Text-Based.
- Sharing Data.
- Platform Independence.
Generic XML Example
<?xml version="1.0" encoding="ISO-8859-1" ?>
<presentation>
<slide number="1">
<name>XML : Introduction</name>
<contents>XML is...</contents>
</slide>
</presentation>
WEB Service
What's a WEB Service ?
- Just a web page meant for a computer to request and process.
- Meant to be consumed by other program or applicaions.
- Even more percisely the name it self indicate that its a service which available over the web.
Architecture
Benefits
- Simple - Supported on many platforms.
- Stateless - a request is made, then result is returned and connection closes, no permanet connection.
- Firewall Friendly - uses HTTP, not usually blocked.
- Loosely Coupled - The interface can be extended.
Types of Web Service
- SOAP (simple object acess protocol)
- WDSL (Web Service Description Language) - XML based document defines the service interface, protocol bindings, and service endpoint addresses
- UDDI (Universal Description, Discovery and Integration) - Repository/database of service
- REST (Representational state transfer)


I am an aspiring full-stack software engineer with extensive skills in SDLC, and specialized in front-end development. With hands-on experience in multiple commercial/side projects, I am able to utilize my software development skills to deliver attractive UI and comprehensive web solutions to solve underlying business problems. As a highly committed professional, I have demonstrated the ability to rapidly acquire new information while maintaining a detailed mindset. Meanwhile, with working experience as a HR specialist, I have developed confident, articulate, and professional speaking abilities, with my easy-going personality I can quickly build good working relationships with people from different backgrounds.
This is a side project to help people visualize the current COVID-19 trending in Australia. This web application consumes an API from the community and did some transformation to display the overall trending as well as the trending in each state.
Live demo: https://c19-trending.herokuapp.com/
Staging environment: https://c19-trending-stg.herokuapp.com/
Source code: https://github.com/CocoLi7777/COVID-19-trending
Highlights and technology:
Front end written in vanilla JavaScript to reduce the script size and for better performance. Use node express to build a proxy for the front-end and serve the static files. Responsive UI using Bulma CSS framework, mobile friendly. Using Chart.js to visualize the data in different formats, like pie chart and bar chart. Setup Continuous Deployment using Github and Heroku, seamless development experience from source code to production. Use Git branch development for the workflow, separate the dev and release branch and deployment pipeline for staging and production environment. Use Google Analytics to track the website usage Integrate with Slack webhook to notify any production error logs in order to resolve the issue in a timely manner. Build local file system cache for the data daily for the backup plan for the third party API failure.The idea of this project comes in the current situation to fight COVID-19 pandemic. As the panic buying disrupts supermarket stock and distribution, I would like to create a tool that can help people to receive the availability notification easier and avoid unnecessary movement. This project is built with Cypress to run an UI automation to check the supermarket product availability. With the help of the CircleCI scheduled workflow, it will be running periodically to help people check the stock availability for a particular product and receive Slack notification. This is a useful tool that can help people use it on a daily basis, also it is a good practice to try out the end to end testing framework and continuous integration tools. Most importantly, this project is a simple, but not easy, solution to solve real life problems in a cost-effective(no cost) manner.
Source Code: https://github.com/CocoLi7777/supermarket_auto
Highlights and technology:
UI automation with Cypress Use CircleCI to run the job to check the availability Setup scheduled cron job on for the CI workflow Integrate Slack for the notification of the availability resultDesigning and rebuilding business website on MVC architecture, from layout, appearance to function according to a client's specifications. Deploying website back-end function by using Node.js, Express, RESTful APIs and MongoDB practices. Creating website front-end layout /user interfaces by using Node.js Pug and standard HTML5/CSS3/Javascript practices. RESTful API design and development. Collecting data, designing the system database and constructing documents, as well as manipulating data with MongoDB. Maintaining website security using encryption, sanitization, rate limiting, etc.
Providing Administration Support to the Accounting Team, Processing payments, filing and archiving Recruiting new hires. Posting advertisement, sourcing candidates, conducting phone interview, 1st round F2F interview or group interview, offering.
Conducting all end to end recruitments of UNISYS Global Service Center China in alignment with business department needs, including sourcing, assessment, candidate management and on-boarding.
 I love soccer becuase it's more as a team than almost any other sport. Communication and cooperation are vital for playing the game and passing the ball.
When forced indoors, I follow a number of suspense movies.


Ryan James Howard is an American professional baseball first baseman who is currently a free agent.
Howard previously played for the Philadelphia Phillies of Major League Baseball (MLB) from 2004 to 2016. Howard stands 6 feet 4 inches (193 cm)
and weighs 240 pounds (110 kg). He bats and throws left-handed. Howard holds numerous MLB and Phillies' franchise records.
Howard made his MLB debut in 2004. He won the National League (NL) Rookie of the Year Award in 2005 and the NL Most Valuable Player (MVP) Award in 2006.
He is a three-time NL All-Star (2006, 2009, 2010), and has won the Silver Slugger Award, Hank Aaron Award, and the NL Championship Series MVP Award in 2009.
Known for his power, Howard is a member of the 50 home run club. He is a two-time NL home run champion (2006, 2008), and became the fastest player to reach both
the 100 and 200 home run milestones in MLB history, passing the marks in 2007 and 2009, respectively.
In 2012, Howard signed a deal with Under Armour to be his new equipment supplier after his deal with Adidas had expired.


HC makes itself a respondent in Cubbon Park annexe case
by DHNSChief Justice Abhay S Oka directed that the Karnataka High Court be made a respondent in the public interest litigation against the proposed construction of the seven-storey annexe of the court in Cubbon Park.
A division bench of Chief Justice Oka and Justice Pradeep Singh Yerur were hearing a PIL filed by the Cubbon Park Walkers’ Association on Monday.
The chief justice asked the advocate for the petitioner why he didn’t make the high court a respondent in the matter.
The petitioner’s advocate replied that they need time to decide on this.
The judge insisted that it was better to make the addition immediately.
The petitioner’s advocate then submitted to the court that he was told that the government was reconsidering the decision to construct the annexe building.
The court asked what was the source of the information. Replying to this, the advocate said the information was “from reliable sources”.
In his reply, Chief Justice Oka told the petitioner that the high court shall be made a respondent and that only then would the truth come out.
The high court then issued a notice to the state government and adjourned the matter to December 5.
However, the chief justice told the petitioner, “You are protesting on this matter outside while your petition is pending before the court. You should choose one proper way to seek justice. We are not stopping you from agitating. But you should rely on one thing,” he said.
The petitioner’s advocate clarified that they were not protesting. “We are only creating awareness,” he added.
The case
The petitioner has contended that the proposal to build the seven-storey annexe building in Cubbon Park was illegal. The petition also opposes the demolition of the old State Election Commissioner’s office, considered a heritage building.
The proposed construction will be a threat to the historical Cubbon Park and important structures like Vidhana Soudha, Raj Bhavan and High Court.


AN EVERLASTING PIECE
Reviewed by Harvey Karten DreamWorks Pictures/ Bayahibe Films Director: Barry Levinson Writer: Barry McEvoy Cast: Barry McEvoy, Brian F. O'Byrne, Anna Friel, Billy Connolly
All attempts at comedy seem to have been swept under the rug in a movie that at best could be called intermittently whimsical, and deserving at least some attention for the way it ridicules the pretensions of the British forces in Belfast and the I.R.A. alike. With a script by Barry McEvoy which is oosely based on the character of his father, "An Everlasting Piece" is directed by Barry Levinson ("Rain Man," "Diner") whose lenser, Seamus Deasy, as set up his camera in the Ardmore studio in Dublin and on location in Dublin and Belfast.
 Levinson opens the picture in a hospital for the emotionally disturbed in which patients report for haircuts to barber Colm (Barry McEvoy)--who got his job through his nurse girl friend Bronagh (Anna Friel)--and his fellow cutter, George (Brian F. O'Byrne). Though George is Protestant and unassuming while Colm is Catholic and cocky, they recite lines of poetry to each other and get along just fine. When Colm learns of a list of balding men maintained by the hospital's most aggressive patient, known as The Scalper (Billy Connolly)--because he literally lifted scalps from four who'd have preferred not to get their hair cut--he and his pal George manage to obtain the register and go into the hairpiece business. Believing that they would have absolutely no competition throughout Northern Ireland, they are dismayed to discover that another firm, Toupee or Not Toupee, is doing business in their town. A large potential customer will award a contract to the firm that sells the most rugs by midnight of Christmas Eve, leading Colm and George aggressively to seek out the glabrous of their politically unstable town.
The whimsy comes from attempts at Saturday Night Live- type sketches as George and Colm gain acceptance by their first customer (who refuses to pay because "possession is nine point of the law"), a large number of British troops who have become bald because of the stress of their hair-raising job, and most notable of all by a balding member of the I.R.A. (Colum Convey) who cannot make up his mind whether to shoot the two as spies or give them some business.
The concept of an I.R.A. man looking as vicious as a Klanman with head covered by a ski mask but as meek as a shorn lamb during the day may have struck some in the film business as bizzare and amusing, but comes across as tired as it is humorless. Even the usually rollicking Billy Connolly, so convincing as the queen's regular date in "Mrs. Brown" and so hilarious during his appearances on Letterman, settles in for a role as a looney tunes with which he is unable to do a thing. If Toupee or Not Toupee is more than a rhetorical question, my advice if you must choose your movies carefully is not toupee.
Rated R. Running time: 105 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


This Site Created By IJSE (Institute Of Java Softwear Engineering) Students
ABSD Anjular CLI Project 2k18


Find the day in which your birthday comes in any year which you want!!!
MON
TUE
WED
THU
FRI
SAT
SUN
Year (In which you want to find the day of your birthday.)
Name (FN LN)
BirthDate
Note: 1. If you know the JSON format enter the year and the vald JSON and press UPDATE to get the birthday plotted in the proper day card. 2. Else enter the year , Name, Birthdate and click on create JSON to get the birthday plotted in the proper day card. 3. Else press the below button and copy the sample JSON data and paste it in the above textarea and enter the year and press UPDATE to get the birthday plotted in the proper day card.


"The Office aspires to maximize efficiency and financial return of all ASUC projects and revenue generating units, maintaining a strong financial climate.
The Office strives to create transparency across all functions of the ASUC to foster a unified student body."


Vanilla
v
Strawberry
s
Chocolate
c
9.3.6.a itemset element example
You must see two select controls that both contain the values "Vanilla", "Strawberry",
and "Chocolate".
List 1 (itemset element) :
List 2 (choice element) :
Vanilla
v
Strawberry
s
Chocolate
c


Warehouse Keeper Hakon:
"Treat the customer's property as if it were your own." That's our motto here! So you know that you can trust us with whatever you choose to deposit in our warehouse.
Private Warehouse
Clan Warehouse
Learn skills.
Quest


What are classes and IDs? They are CSS elements that can apply and manipulate HTML elements, similar to an image manipulatator like Photoshop how you can adjust image length, size, position, etc.
The difference between the two is that Classes can be applied to multiple HTML elements which can make things simplier if you need something to show up on every page such as a sidebar while IDs should only be used once in a single HTML element, in other words it should be unique to once HTML element.
 Classes use the "." (fullstop) symbol whilst IDs use a # (hash) symbol.
some class examples would be below: using a Class to make some text red and using an ID to make a specific piece of text yellow and appear only on the right side
This text is red
This text is also red
This text is unique because it is the only one using yellow and on the right side
Example of both a class selector and ID selector below in CSS.


{% extends "base.html" %} {% set active_page = "Tutorials" %} {% set page_title = "Tutorials" %} {% block head %} {{ super() }} {{ components.calendar_scripts() }} {% endblock %} {% block heading %} {{ components.section("Tutorial") }} {% endblock %} {% block content %}
Below is the schedule of the tutorial to be held on Sunday, July 5th, 2020. Hover over a tutorial to view full details and click on it to access its material.
Tutorials held in parallel are shown one besides the other in the calendar.
Some tutorials are held twice and some are held once.
Checkout this blogpost by tutorial chairs to know about the modalities of differnt tutorials in three stages: before, during and after the tutorial.


Computationally efficient functions to provide direct likelihood-based inference for partially-observed multivariate birth-death processes. Such processes range from a simple Yule model to the complex susceptible-infectious-removed model in disease dynamics. Efficient likelihood evaluation facilitates maximum likelihood estimation and Bayesian inference.
| Version: | 0.2.0 |
| Depends: | R (≥ 3.1.0) |
| Imports: | Rcpp (≥ 0.11.2), RcppParallel |
| LinkingTo: | Rcpp, BH, RcppParallel |
| Suggests: | testthat, knitr, rmarkdown, MCMCpack, ggplot2, matrixStats, plotrix |
| Published: | 2016-12-05 |
| Author: | Lam S.T. Ho [aut, cre], Marc A. Suchard [aut], Forrest W. Crawford [aut], Jason Xu [ctb], Vladimir N. Minin [ctb] |
| Maintainer: | Marc A. Suchard <msuchard at ucla.edu> |
| License: | Apache License 2.0 |
| NeedsCompilation: | yes |
| Materials: | README NEWS |
| CRAN checks: | MultiBD results |
| Reference manual: | MultiBD.pdf |
| Vignettes: |
Simple_SIR_MCMC bdsem_tutorial |
| Package source: | MultiBD_0.2.0.tar.gz |
| Windows binaries: | r-devel: MultiBD_0.2.0.zip, r-release: MultiBD_0.2.0.zip, r-oldrel: MultiBD_0.2.0.zip |
| OS X binaries: | r-release: MultiBD_0.2.0.tgz, r-oldrel: MultiBD_0.2.0.tgz |
Please use the canonical form https://CRAN.R-project.org/package=MultiBD to link to this page.


This is the management portal for the UBC edX Software Development Capstone Project. Members of this capstone course can use this system to provision their repositories and teams and monitor their progress for this self-paced capstone project.


Your score on Midterm 1 was {{score}} / 45. For comparison, this exam had:
The grading scale for this exam is:
Overall course grades will include plus/minus grades such as B- or B+ as well as just a B. On the above scale, these finer cutoffs roughly divide each full grade range into thirds.
Important Note: While your exam was hand-graded by highly skilled TAs, this system of returning exams electronically is new and includes autorecording of individual problem scores. Please check to make sure that your total score, listed above, matches the sum of your scores on the following pages!


logger.extendedfilelogger
-
Declaration
enum string
simplePattern
;A simple pattern - 020-06-08T17:50:25.673 info :
-
Declaration
interface
ILogPattern
;Interface of all log patterns
-
Declaration
abstract @trusted void
applyPattern
(FileoutputFile
, stringfile
, intline
, stringfuncName
, stringprettyFuncName
, stringmoduleName
, LogLevellogLevel
, TidthreadId
, SysTimetimestamp
, SysTimestartTimeStamp
);Writes on a outputRange of chars, the logging pattern
Parameters
File
outputFile
output File where where tow rite the logging request.
string
file
file
name where the logging request was issued.int
line
line
number from where the logging request was issued.string
funcName
the function or method name where the logging request was issued.
string
prettyFuncName
the function or method prettyfied name where the logging request was issued.
string
moduleName
the module name where the logging request was issued.
LogLevel
logLevel
the actual log level of the accepter logging request.
Tid
threadId
the thread id where the logging request was issued.
SysTime
timestamp
the
timestamp
of the logging request.SysTime
timestamp
the
timestamp
of when the logger was created.
-
-
Declaration
class
SimpleLogPattern
: logger.extendedfilelogger.ILogPattern;Simple loging pattern that outputs the same pattern that classic FileLogger
-
Declaration
@trusted void
applyPattern
(FileoutputFile
, stringfile
, intline
, stringfuncName
, stringprettyFuncName
, stringmoduleName
, LogLevellogLevel
, TidthreadId
, SysTimetimestamp
, SysTimestartTimeStamp
);Writes on a outputRange of chars, the logging pattern
Parameters
File
outputFile
output File where where tow rite the logging request.
string
file
file
name where the logging request was issued.int
line
line
number from where the logging request was issued.string
funcName
the function or method name where the logging request was issued.
string
prettyFuncName
the function or method prettyfied name where the logging request was issued.
string
moduleName
the module name where the logging request was issued.
LogLevel
logLevel
the actual log level of the accepter logging request.
Tid
threadId
the thread id where the logging request was issued.
SysTime
timestamp
the
timestamp
of the logging request.SysTime
timestamp
the
timestamp
of when the logger was created.
-
-
Declaration
class
ConfigurableLogPattern
: logger.extendedfilelogger.ILogPattern;Configurable logging pattern that parses a string pattern
Discussion
The pattern it's based of log4j pattern layout format:
Conversion Character Effect m Module name d Used to output the date of the logging event. Actually only outputs on ISO format F Used to output the file name where the logging request was issued. L Used to output the line number from where the logging request was issued. M Used to output the function or method name where the logging request was issued. p Used to output the priority of the logging event. r Used to output number of milliseconds elapsed from the construction of this logger until the logging event. t Used to output the thread that generated the logging event. -
Declaration
@safe this(string
logPattern
= simplePattern);Builds a configurable log pattern
Parameters
string
logPattern
String pattern to apply. By default uses
simplePattern
-
Declaration
@trusted void
applyPattern
(FileoutputFile
, stringfile
, intline
, stringfuncName
, stringprettyFuncName
, stringmoduleName
, LogLevellogLevel
, TidthreadId
, SysTimetimestamp
, SysTimestartTimeStamp
);Writes on a outputRange of chars, the logging pattern
Parameters
File
outputFile
output File where where tow rite the logging request.
string
file
file
name where the logging request was issued.int
line
line
number from where the logging request was issued.string
funcName
the function or method name where the logging request was issued.
string
prettyFuncName
the function or method prettyfied name where the logging request was issued.
string
moduleName
the module name where the logging request was issued.
LogLevel
logLevel
the actual log level of the accepter logging request.
Tid
threadId
the thread id where the logging request was issued.
SysTime
timestamp
the
timestamp
of the logging request.SysTime
timestamp
the
timestamp
of when the logger was created. -
Declaration
protected string
logLevelPrefix
(const LogLevellogLevel
);string preceding loglevel. Usefull to colorize it, with ANSI
-
Declaration
protected string
logLevelPostfix
(const LogLevellogLevel
);string following loglevel. Usefull to colorize it, with ANSI
-
-
Declaration
class
ExtendedFileLogger
: std.experimental.logger.filelogger.FileLogger;Extends FileLogger to support configurable pattern
-
Declaration
@safe this(const string
fn
, const LogLevellv
= LogLevel.all, ILogPatternlogPattern
= new SimpleLogPattern);A constructor for the
ExtendedFileLogger
Logger.Parameters
string
fn
The filename of the output file of the
ExtendedFileLogger
. If that file can not be opened for writting an exception will be thrown.LogLevel
lv
The
LogLevel
for theExtendedFileLogger
. By default theILogPattern
logPattern
An implementation of the
ILogPattern
. By default uses SimpleLogPattern.Example:
auto l1 = new ExtendedFileLogger("logFile"); auto l2 = new ExtendedFileLogger("logFile", LogLevel.fatal); auto l3 = new ExtendedFileLogger("logFile", LogLevel.fatal, new ConfigurableLogPattern("%m %-5p %d - "));
-
Declaration
@safe this(const string
fn
, const LogLevellv
, ILogPatternlogPattern
, CreateFoldercreateFileNameFolder
);A constructor for the
ExtendedFileLogger
Logger that takes a reference to aFile
. TheFile
passed must be open for all the log call to theExtendedFileLogger
. If theFile
gets closed, using theExtendedFileLogger
for logging will result in undefined behaviour.Parameters
string
fn
The file used for logging.
LogLevel
lv
The
LogLevel
for theExtendedFileLogger
. By default theLogLevel
forExtendedFileLogger
isLogLevel.all
.CreateFolder
createFileNameFolder
if yes and
fn
contains a folder name, this folder will be created.ILogPattern
logPattern
An implementation of the
ILogPattern
.Example:
auto file = File("logFile.log", "w"); auto l1 = new ExtendedFileLogger(file); auto l2 = new ExtendedFileLogger(file, LogLevel.fatal);
-
Declaration
@safe this(File
file
, const LogLevellv
= LogLevel.all, ILogPatternlogPattern
= new SimpleLogPattern);A constructor for the
ExtendedFileLogger
Logger that takes a reference to aFile
. TheFile
passed must be open for all the log call to theExtendedFileLogger
. If theFile
gets closed, using theExtendedFileLogger
for logging will result in undefined behaviour.Parameters
File
file
The
file
used for logging.LogLevel
lv
The
LogLevel
for theExtendedFileLogger
. By default theLogLevel
forExtendedFileLogger
isLogLevel.all
.ILogPattern
logPattern
An implementation of the
ILogPattern
. By default uses SimpleLogPattern.Example:
auto file = File("logFile.log", "w"); auto l1 = new ExtendedFileLogger(file); auto l2 = new ExtendedFileLogger(file, LogLevel.fatal);
-
Declaration
protected @safe void
beginLogMsg
(stringfile
, intline
, stringfuncName
, stringprettyFuncName
, stringmoduleName
, LogLevellogLevel
, TidthreadId
, SysTimetimestamp
, Loggerlogger
);This method overrides the base class method in order to call the log pattern
-


Presenteract is a project to facilitate interactive presentations, where the audience can see and interact with slides from their phone/device/laptop.
Connect to the currently "open" deck, for this presentaiton. Often there is a QR code or a URL provided to make this simpler.
Wait for the Presenter to change slides for you.
Polls should be very simple, just choose an option and submit.
To present, you must login, via Facebook or via Google. Once logged in, you'll have an option for "My Presentations" and the ability to add new ones.
New Deck/Presenations will be created without any slides. You must add at least one slide to be able to use it.
Only "Open" Presenations are available to audience members. You can edit Presenations while open, and audience members should get your changes automatically synced.
Only the "owner" / "creator" of a Presenation can control/run it.
Bug Reports and Feature Requests are available. If there is a significant need, we will improve this to a knowledge base.
Developers, the code is available on GitHub
Wow. At every step of the way I've been impressed by MeteorJS. The framework is exception in the functionality it provides users in the application. It is also very easy to work in and includes tons of tools for developers.
PhoneGap is an excellent project, wrapping web applications into mobile device "apps".
This Excellent and Prolific CSS framework makes createing attractive, standardized, responsive, and very functional web applications easy.
Who doesn't use jQuery? In fact, we don't use it a ton, because MeteorJS does most of the lifting, but we still use jQuery to work with the DOM a bit.
The underscore library is a very handy JavaScript toolbox... Don't leave home without it.
A simple, clean, attractive and super-fast JS library for rendering HTML charts.
For the admin interface, we have a "Click to Edit" or "Edit in Place" interface provided by X-Editable. It rocks!


--- layout: default ---
Send and email to<EMAIL_ADDRESS>We strongly believe that diversity of experience, perspective and background will lead to a better workplace for our employees and a better product for our users.


Git Bloggin'
7/11/15
Version control is something that keeps track of the changes you make to a specific file. This was created in order to make it easier for developers to work and colloborate on a project together.
Git is a version control system thats built into your computer. This allows you and other developers access to track all types of changes. Git first puts the file in Tracked or Untracked. From here if the file is tracked its goes into Unmodified, Modified and Staged. From this location you can track each step it takes throughout workflow.
The largest benefit of storing code inside Github is being able to easily collaborate and share code with other developers. Whether they be part of a project or helping you better a program through open-source. It also allows you to easily edit work from a text editor such as Sublime text. With this process and the use of a terminal you can easily pull and push projects in a matter of minutes. Github is also very resourceful with numerous files built to help you use their site as well as other programs.