Developer Communities: All You Need to Know

robusta_Blog Posts-12

What are Developer Communities?

Developer communities are places where we can

  • Share and brag about our work
  • Ask questions and find help
  • Follow for news
  • Make new connections and meet new people in the development field

They’re all about “finding solutions” and building up new experience, closer aligned with a community of practice than a community of any other type.

Communities you have to be following

In our field, there are A LOT of online communities that focus solely on development like

We also have other channels that are superiorly active like

  • Facebook tech groups/pages
  • Reddit tech subreddits
  • Google developer groups
  • Twitter

Huge companies and enterprises building products for the developers to use started to realize the importance of actively participating in the community through seeking the developers themselves. A new role has emerged called “Developer Evangelism,” where a developer evangelist is someone participating in the community in a way that makes him advertise for a product while making it sound exciting to others and without being intrusive.

You can find developer evangelists all around you. They are the people you follow on Twitter for news, who write tutorials on their blogs telling you how to do something. Think of them as social and brand influencers of all things technical development. Examples are countless and include

In Egypt, most of the tech communities are driven by individuals and not by companies or organizations. The role of developer evangelism hasn’t really matured enough yet. Instead, big companies who build ready-to-use “solutions” (like Oracle and Microsoft) advocate these solutions to other companies; not to developers

We have a big chance of taking the lead in the tech communities through focusing on the “Individuals.”

Why you should actively participate in developer communities

Developers in general show interest in participating in tech communities because it’s a way to create new connections. Connections are important because they mean

  • New technical knowledge
  • New job opportunities

How you can start contributing to the community TODAY

 Before you start contributing, there’s a set of skills you need to know that you have to work on along the way

  •  Be extremely eager to learn
  •  Be an excellent communicator through verbal and written communication
  •  Enrich your technical competence in your areas of interest
  •  Be an excellent listener and have the capacity to discuss anything

There are mainly 2 channels you should be focusing on…

 1. Online communities

   These will massively help you grow your technical knowledge and will show you how others discuss things and communicate with each other. Most importantly, they will highlight your weaknesses and allow you to work on them at your leisure.

 2. Offline/Local communities

  These are where you start having impact on others, sharing as well as always learning along the way. You start to advocate and give advice.Take care that you should be open to all opinions even those that trigger you and those you think are worthless though.

Benefits of having a leading role in local communities

  •  Your technical knowledge will grow significantly.
  •  You become more confident in the work you do and start enjoying it more and more.
  •  People start to idolize you as an expert (careful about that).
  •  You build relationships with other developers, entrepreneurs, and companies. Your connections grow beyond what you ever thought they could.
  •  You dedicate sometime everyday to reject the job offers you are getting via LinkedIn and emails 🙂

Benefits that the organization you belong to gains

  • With the growth of your technical knowledge, your organization is directly affected by the quality of the work that you perform.
  • Customers will have more confidence in your organization’s work.
  • Your organization starts attracting more customers.
  • Your organization starts attracting candidates who are eager to learn because they want to work with “YOU”.

Where you should start first

 1. Online

  • Participate in online discussions like Stackoverflow, Reddit, Github
  • Build something that you know will benefit other developers.
  • Write down articles on your personal blog, organization blog, Medium, WordPress giving your personal insights and ideas on a particular problem
  • Check local communities like Facebook tech groups and help others whenever you can through comments and answering questions whenever possible.

 2. Offline

  • Check for student activities and offer your services as a mentor/speaker at universities.
  • Offer to help those who are trying to give back to the community either through organization or through metorship/speaking (RailsGirls Cairo)
  • Find and attend local meetups and show your will to participate in organization and speaking. If none is available, start building your own community with the help of your friends and colleagues.

Bro tips

  • A good advocate is someone who is technically superior. Keep reading and learning and trying. Question your work and methods. Seek excellence.
  • Be kind to others around you. Their age, color, gender, religion or technical capabilities should never matter. As long as they are not toxic, you should stand at the same distance from all.
  • Listen carefully and don’t underestimate anyone. You would be surprised by the ideas and the work of the people you frankly think they aren’t as good as you.
  • Always be humble.
  • Give without waiting for a return. Good deeds pay off in ways you cannot imagine.
  • It’s a long-term investment that takes time. Be PATIENT and always enjoy the ride.

Android RTL Support

Abouraya blogpost1200-06

The majority of mobile apps are designed LTR (Left to Right), that is because the vast majority of the world languages are written from Left to Right and only a small number of languages are written from Right to Left such as Arabic. Most of mobile developers never worry about this issue since most of the apps are not intended to target users from regions using languages written from Right to Left also because it was not as easy as it is now to support both directions. As the competition started heating up, it became important to globalize the apps and provide localized versions in order to reach more users and improve app downloads. Moreover,  the rise of mobile apps development in these Arabic-speaking countries made it crucial to provide RTL support.

It is very easy to provide localized versions for different LTR languages in android apps by just providing another strings.xml file under values-XX folder where XX is the language code which contains all the translations for the strings used in this app.

Android 4.2(API 17) released in 2013 has provided full Native support for RTL layouts; it has become very easy to take advantage of this feature and all you need are just few simple changes in your code.

How to start:

First of all, in your Manifest.xml file, you need to declare under the <application> element android:supportsRtl=”true”

Use Start and End layout properties instead of Left and Right, respectively. In LTR layouts, start means left and end means right; however, in RTL start means right and end means left.

Examples for these properties are Padding, Margin, TextView Drawables, Gravity, LayoutGravity, and layout alignments.

In case you need a custom layout in for RTL, just provide the layout with the same name under ldrtl qualifier

Drawables:

Usually the icons you are using are direction independent, so you will not need alternative drawable for RTL; however, there are some cases where you will have to, for example, the back button.

Normally for LTR this is how it looks like:

Screen Shot 2017-02-13 at 10.26.39 PM

If you use the same button for RTL this is how it will look like:

Screen Shot 2017-02-13 at 10.26.54 PM

While what you need is this:

Screen Shot 2017-02-13 at 10.49.45 PM

You can achieve this by mirroring the icon using an external tool and add the new icon with the same name in drawable-ldrtl folder, or just use the forward navigation button and change it’s name in “drawable-ldrtl” folder

In case your minimum SDK is 19, you can use android:autoMirrored=”true” attribute in vector drawables where as the name implies will automatically mirror the icon vertically in case the direction is RTL

Text appearance:

For more control over the text appearance, you can use these attributes

android:textAlignment — attribute for setting the alignment of a component’s text.

android:textDirection — attribute for setting the direction of a component’s text.

Use gravity for textAlignment which is default for the root view. The gravity determines the alignment, ALIGN_NORMAL, ALIGN_CENTER, or ALIGN_OPPOSITE, which are relative to each paragraph’s text direction

Use locale for textDirection which makes the paragraph direction is coming from the system Locale.

To apply these attributes you can add it each textview or globally by adding it to main AppTheme in styles.xml

<item name="android:textAlignment">gravity</item>
<item name="android:textDirection">locale</item>

To know about the variations of textAlignment and textDirection attributes check

https://developer.android.com/reference/android/R.attr.html#textAlignment

https://developer.android.com/reference/android/R.attr.html#textDirection

Application Language Preference:

All the mentioned-above is sufficient to provide RTL layout and in case the app is supposed to follow the device’s language then nothing more is needed. However, in case the user is supposed to be able to choose a specific language, then few more lines of code are needed.

To change the Locale of the application programmatically use the following

String langCode=”ar”;
getContext().getApplicationContext().getResources().updateConfiguration(changeLanguage(code)),
getResources().getDisplayMetrics());
public static Configuration changeLanguage(String code) {
  Locale locale = new Locale(code);
  Locale.setDefault(locale);
  Configuration config = new Configuration();
  config.locale = locale;
  return config;
}

Then restart the activity to apply the changes

startActivity(getIntent());
finish();

However, if the user changed the language of the device, the app will be affected, and in order to prevent that use configChanges attribute under each <activity> element in the Manifest and list Locale and layoutDirection as the changes you would like to handle manually.

android:configChanges=”locale|layoutDirection”

This prevents the application from recreating the activity then override onConfigurationChanged in the activity

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
…
…
}

Then you can reapply the user’s configuration for the app again in onConfigurationChanged

getContext().getApplicationContext().getResources().updateConfiguration(
changeLanguage(Session.getLanguage()), getResources().getDisplayMetrics());

Fallback to LTR:

It is possible to force a certain layout direction using android:layoutDirection, it can be useful, for example, when using a ViewPager and TabLayout, the default sliding animation is LTR when doesn’t change in RTL. So a possible solution is to keep the android:layoutDirection=”ltr” and reverse the tabs orders and fragments programmatically. You can check at runtime if the layout is RTL using this method in TextUtils getLayoutDirectionFromLocale .

Another example  is the phone number field, numbers direction are always LTR which means it does not change with language direction, so a possible solution is to use Left and Right instead of Start and End or use android:layoutDirection=”ltr” for the parent view.

Screen Shot 2017-03-13 at 11.21.45 AM

Hopefully these tips could help you with your developing any application in Arabic. Please don’t hesitate to comment below if you have any questions regarding RTL support in android or anything regarding android development in general. Finally please refer to the official android blog for more information about native RTL support.

https://android-developers.googleblog.com/2013/03/native-rtl-support-in-android-42.html

Capitalizing on Technology in Charity

01

Charity has always been one of the fundamental themes in the lives of Egyptians. With the continuous declination of the standard of living for both the lower-middle and lower classes in the society, NGOs and people working in the charity and CSR fields are facing a huge challenge to provide an adequate support to those social classes that the country’s government is failing to provide.

Charity and community service in Egypt comes in many forms such as NGOs, CSR departments in corporates, clubs in universities, small groups of friends or even individuals. Activities in all these entities are typically more centralized around some seasons that are mostly religion-related. However, to give you a hint of how huge this theme is in Egypt, during Ramadan only in 2015 approximately EGP 30 Billion donations were collected according to the official numbers. (For more details about the economics of donations in Ramadan, we recommend this article by Omar El Shenety.)

In spite of this huge amount of spending and donations, the relationship between charity and technology in Egypt remains very shallow. From my personal experience in this field and what we have reached in robusta throughout the different engagements with NGOs and CSR departments, I believe that technology isn’t being fully utilized or even slightly utilized at a minimum level to help in the charity work here in Egypt.

During our previous engagements in robusta with lots of NGOs, we noticed that most of them are only willing to make use of technology superficially by building simple websites to use them only as an online informative tool. While on the other side there are several serious problems that are present in the current charity/CSR model that technology would really help in resolving but utilizing technology isn’t on their roadmap.

Below are some examples of the current problems and how technology can help resolve that.

Accessibility of Donating

It is such a pity that people are creating WhatsApp groups to collect money for certain cases. Meanwhile a simple web/mobile application listing the cases by their different types and with detailed information can be very handy especially when it is integrated with an online payment gateway provided by bank or independent platforms like Payfort.

Cases Reach

Lots of people sometimes want to donate money/furniture/…etc and actually don’t know where or how to donate despite the huge number of NGOs. The idea is that you want a simple way to do so which is quite feasible by a location based mobile app that detects users’ locations and can show the different cases around them with their needs. Location based apps can be used in an opposite way by NGOs to see the donors around them and get in contact with them.

Reaching out to more people around the globe

A lot of Egyptians all over the globe would mostly prefer to give their money donations or Zakah to the poor in Egypt or to help the people here to establish microprojects via microloans or similar models yet unfortunately there are no easy to use, credible and transparent platforms where they can do that. Then what about a mobile application that aggregates the cases from the different NGOs with their statuses and integrates with a payment gateway allowing people from other countries to donate their money online to specific cases.

Transparency

Any donor usually needs answers to some questions, where am I putting my donations exactly? which case am I supporting? and the more the donor pays, the more details and follow up they would expect to be provided with. This type of transparency is typically very difficult when you donate, for instance, via SMS or when you donate to an NGO via bank transfer but you aren’t sure where this amount of money was placed. The issue of transparency normally hinders some people from donating to NGOs. Again, this can be achieved by personalization of the donation experience when the user can have a dashboard listing the cases they are donating to and follow up on their progress with whatever amounts of money paid and with some history and statistics about the previous donations and cases.

Recurring Reminders and Notifications

We all usually get consumed in our daily work so we continuously need those reminders from NGOs or our friends if we pay a recurring donation to help some cases and technology definitely can help automating all of that with a combination of simple cron jobs on the server side and push notifications via an almost free service like Amazon SNS.

Follow up and Reconnecting

Technology in general will easily help the NGOs and the donors in several other aspects. One of those is following up on some cases that they donated for via SMSs or Push notifications which will definitely increase the credibility of the NGO.

Another one is reconnecting with the donors in case they are interested in helping specific types of cases when those cases appear or even sending and receiving feedback between Donors and NGOs.

Some Inspiring Examples

There are several inspiring examples in the charity world. I will just demonstrate the idea of three of them and there are others of course all over the globe.

Kiva is an amazing platform that provides microloans to different people all over the world to use them in unique and useful projects that would fit in their environment. The donations are mainly crowd-sourced and you can actually even choose to lend some people to help them do their project and then return your money back after they pay  and if you’re worried about being getting your money back, the loan repayment rate is 97% which indicates how successful they are.

Watsi is another adorable non-profit platform that focuses on crowd-sourcing donations to patients all over the world who are facing difficulties in paying for their treatments. They have an extensive database about the patients with their detailed cases, their stories and so on.

Farmraiser is a web and mobile platform that was built by robusta. It is a very good example for a community-service-like profitable platform. It is built to help organizations like schools, clubs,…etc raise funds for their campaigns by making students sell healthy food and these profits go to funding campaigns so there are four parties that are benefiting and profiting here, vendors who sell their products, campaign organizers who receive  funds for their campaigns, customers who buy healthy products and are encouraged to lead a healthy lifestyle and finally students who participate in the whole community service experience and learn to give back to their community.

There are definitely tons of other platforms with various ideas out there yet those three examples are just simple examples on the different types of platforms we are talking about and hope they would be utilized, implemented and followed instead of going for an informative website for an NGO.
To sum up, it is crucial for all NGOs and people working in the CSR field to pay attention to capitalizing on the available technologies and think creatively about new ideas that would make the lives of everyone easier and gets the most benefit out of the available tools that are already utilized by many and are becoming part of the people’s daily lives and culture.

Top 10 Reasons Why We Quit Social Media

Now that we’re in Ramadan, the prime time for advertising, media and communication, it reminded me of why we’ve come to consciously and intentionally shut down our social media operations only a little bit less than 1 year ago. Back then, we had an amazing team of creatives and a bunch of notable accounts yet we still decided to cut it off and, since then, chatting with other agencies about social media only feels relieving and reassuring.

but-why-meme-generator-social-media-why-1a8b62

I feel socially obliged to share it with my fellow entrepreneurs out there to either save them precious years of their lives or inspire them to come up with their own recipe of success.

We’re not so impulsive here at robusta nor do we follow the crowd. We have exhausted all analysis before finally deciding social media is not for us. Here are 10 reasons why.

gwed-lad-free

  1. Barriers… What barriers? I can’t see no barriers!

Everybody knows that a market with a high entry barrier for competition is a market that’s more secure and sustainable and as the barrier becomes lower it quickly becomes a red ocean where only the lower price wins. In the social media ground, your grandma can start her own social media agency, today, right from her comfy couch, and compete with you tomorrow on that Culinary Workshops account. No?

Peter_Griffin_And_The_Chicken

  1. Fresh Blood.. You’re Bloody

Now that everyone already knows there’s a social media agency around every corner and a social media freelancer in every family, you become easy to replace. Clients will always feel empowered, tempted and encouraged to ditch you and try something new. Even if you’ve done a good job, at some point it’s always time for fresh blood. Your agency will probably exhaust its creative concepts for the client in the first couple of campaigns and just as you’re recharging your creative energies for the next campaign, your client will seek out to other agencies knocking their door to listen to new pitches, lower prices and once this starts they will find every reason to ditch you and find their next prey.

flat,800x800,075,t.u1

  1. Pricing

Social media account management market prices are somewhere between EGP 4K to EGP 12K for at least 80% of local accounts. This should supposedly pay for team’s salaries (designers, copywriters, community managers, creatives, media and account manager), indirect salaries to keep your agency running and expenses such as your rent & utilities and make a worth-it-enough profit. That’s probably one reason why agency owners turn out to be so mean to their people, pay them peanuts, delay their salaries or even skip it at all or they reach out to deep pockets to finance the show and keep their star accounts alive and rocking, despite losing.

wolf-of-wall-street

 

  1. It’s not really social media, it’s a game of PR

Social media on its own is really not an offering; however, PR is. If you’re into PR with its different practices from Events to Press to Media Relations etc… social media can be an essential complementary service. If you’re only doing social media, you’re as good as gone.

great_gatsby

 

  1. You’re either friends with the “influencers” or you’re screwed

In a country like Egypt, social media is driven by shepherds, commonly known as social media influencers. They would tell the people what to like, what to eat and where to go, and you’re either friends with them (you can buy it at $9.99 in low seasons and as high as $99,999 in higher seasons) or you can struggle to speak in the vacuum

57761423

  1. Ads

Your agency is being paid peanuts that can’t even cover your costs and then your competitors come up with that creative pitch and bottom low pricing. How can they do that? Ads. Most of the agencies lose on their social media fees and make “profits” out of the ads business. Ads, being a slightly more technically involved business, are almost not audited by the clients. But even that has a price war to the extent that you find agencies claiming to run ads for 5% management fees aka out of a 100K campaign over 3 months (which is a relatively well-funded campaign), they charge 5K which is less than 2K a month. WTF? 2K to finance the ads manager, designs, optimization, reporting and account management? You guys are either losing or you’re just taking a cut out of the 100K behind the client’s back and poor clients barely understand 20% of what the agency wants them to understand about their ads.

d53a9d9b6f54131c6a6ee24690ee64fcccda2946372a331428d20d42ce0e31f9

  1. Social Media is not steroids, say that to your client!

Clients expect social media campaign today – tomorrow I’m the most popular on Facebook or nothing. Clients want to have their say on the design, the copy writing, posting frequency & posting times and on the claim of company policy and then you’re held accountable for results.

They expect every post to be a campaign on its own. While it’s understood that every now and then a campaign to shake things up is a nice thing but it’s just unfair to expect. They compare a post to a TV commercial that takes shit loads of money, time & team to produce and has a lifetime that could extend anywhere between 1 to 6 months. They expect a post to drive sales, directly, all the time.Moreover, clients don’t want to spend enough on ads to make social media work and they’re not even educated about the difference between a social media post and the lifetime of a post.

yY6dWUy

  1. Payments & Cash flow

Knowing how contracts work around Egypt, a wise agency needs to have its own collection strategy that keep its cash flow near healthy and know for sure this has to be a mixture of relations, politics, red eye and knowing where and when to stop the tap. With social media, you have to keep the show running for the account day in and day out if you want to stay in it. Regardless of your payments status, you have to always be a giver and your client will almost always find a reason to delay your payments, and poor you having to keep their show running regardless or just lose it at all.

Big change begins with small steps

  1. The illusion of growth

80% if not more of the social media agencies are either unethical in the ways they make money (see: ads) or they’re chasing after the illusion that they’re now incurring losses to build their portfolio and once they strike the right balance, they’re on the way to endless profits. This is just bullshit.

4454454

  1. You don’t really have a strategy & the model is immature

You need to be joker of all trades.. and yes you will be master of none. The game between a company’s marketing team, creative agency and production agency is just not that mature, yet.

Few last words…

We see it as an integral part of the communication and requires lots of customer service and alignment on day in & day out business operations so better done in house. If you want to survive you need to focus on the niche. It’s collaborative team work. It will not work without a PR who takes care of events coverage.

If you want to survive you need to do it 1. a-la-a call center style, 2. creatively and find your niche (like Kijami) and 3. complement it with a powerful barrier (own your own media channels like MO4).

We told you what’s going wrong with social media. Here’s a list of social media agencies worth considering who’re good at what they do and can tell you what’s good about it.

  • Unplugged: Good, passionate & ethical people
  • Mental Media: Young and progressive
  • MO4: Dirty as the media game can get. F&B and Nightlife freaks
  • Kijami: Truly grabbing the essence of social media
  • Nineteen84 Management: I had to have a list of 5 because 4 seems to be odd

To Infinity and Beyond

 

Arguably, one of the movies’ most famous catchwords, and despite the fact that my number 1 early-morning activity with my 3-year-old has recently been watching and reciting Toy Story at 7am on a weekend with one eye open and the other half-asleep, this post plays to a more serious note about an organization’s own journey of self-exploration…

2015 was a particularly interesting year for robusta particularly because, for a change, we rethought our strategy, structure and, believe it or not, our robustivity vision, too!

Lots of concerns have triggered such exercise. It was mostly about the pursuit of profitability, sustainability, scalability and where we see robusta in 5 years from now. It was quite regular of a discussion between the managing partners to question the scalability of robusta and if it’s ever a candidate for exceptional growth that fulfills ours and the team’s aspirations for humongous growth. Don’t get me wrong! robusta was doing quite well already but we’ve always seen robusta not as a boutique agency but rather a flagship empire and been questioning a lot the way to get there.

Inspired by Gallup’s Strengths Finder and our IGNITE Development Program designed and implemented by our good friends at Mirqah ( more on this in upcoming episodes), we decided to start our pursuit by identifying and playing to our organizational strengths.

Cutting a long story of several client meetings (more of disguised interviews), internal workshops and self-reflections, it was becoming clearer that our top 3 strengths were our solid development skills and portfolio, a strong and influential culture fueled by an exceptionally competent team and robusta’s brand equity, reputation and reach within diverse verticals. Our weaknesses have always been lack of clarity to what we aspire to become that translated into stretching ourselves too thin across several streams which eventually lead to subpar profitability.

Building on this understanding, we made some bold decisions of exiting some of our service offerings and accounts. We’ve completely abandoned Branding, Social Media, Microsoft-based technologies, and trivial/low potential tickets. The reasons why we stopped each are quite interesting and each deserves a blog post on its own. We naturally decided to focus on our leading services which are E-Commerce, Mobile, Websites and Web Apps.

We also turned around our perspective looking at our team and decided to get rid of the illusion of growth that comes with growing our headcount after figuring out this is, in most cases, nothing but a sign of lack of efficiency. Comes next naturally is an overpowering need to look after productivity and a sharply pruned work force that makes it easier to invest in our culture & human capital development.

Ironically, we’ve also figured out that there’s such a HUGE local market that we need to dominate first before crawling beyond borders. Last but not least, we’ve done what turned out to be a pretty good job standardizing and innovating our retainer-based project development/support packages.

The said resolutions automatically put us on track with total clarity on how to go about restructuring the organization to achieve what became our solid vision.

“To serve as a flagship of national economy and become one of the top listed EGX companies by 2030”

This also fits perfectly with our designated 4-fold mission towards our clients, our people, shareholders and the community.

Finally, what we’ve mostly learned the hard way is that although focus seems to be an obvious strategic recommendation for any organization, it takes a lot of wisdom and learning about your customers, competitors, team and, of course, yourself to really be able to tell what focus means and how it applies to your organization.

Populating microsoft word documents

In a recent project, a client asked for a feature that he would be able to download word documents templates that should be pre-populated with some data based on the user record in the database. The idea we used here is that we add unique text place holders in the document templates to replace them later with the needed data. The project environment was Linux(Ubuntu), as such we cannot rely on modules like pywin32 http://sourceforge.net/projects/pywin32/ in our document generation.

On investigating word documents it was found out that docx files are actually made and described specifically using xml. If you change a .docx file extension to .zip and investigate the .zip folder you will find that it contains the following structure:
[Content_Types].xml

word/

_rels/

docProps/

The standard Microsoft released for docx documents was released in 2007 and was called Open Xml which you can know more about from http://msdn.microsoft.com/en-us/library/aa338205%28v=office.12%29.aspx

Inside the word/ folder is the key xml describing the the document document.xml. We manipulate the place holders we put in the templates from this file document.xml. and replace these place holders with the required data based on each user to give us the file for the user to download. The code below covers generating and populating the template with the variables that are already given in the dictionary variable replacements.water slides for sale

import zipfile
#method to render templates
def render_template(template_path, output_path, replacements):
  #we convert the docx to zip files via the zipfile built-in library
  template_document = zipfile.ZipFile(template_path)
  rendered_document = zipfile.ZipFile(output_path, "a")

  #read the document.xml after extracting it from zip file
  with open(template_document.extract("word/document.xml")) as tmp_xml_file:
    tmp_xml_str = tmp_xml_file.read()

  #replace place holders with the values from the replacements dictionary
  for key in replacements.keys():
    tmp_xml_str = tmp_xml_str.replace(str(key), str(replacements.get(key)))

  #write the changed xml with replaced strings
  with open("tmp.xml", "w+") as tmp_xml_file:
    tmp_xml_file.write(tmp_xml_str)

  #copy the same files from the template archive to the new to be rendered template except document.xml
  for file in template_document.filelist:
    if not file.filename == "word/document.xml":
      rendered_document.writestr(file.filename, template_document.read(file))

  #write the modified document.xml to the new doc
  rendered_document.write("tmp.xml", "word/document.xml")

  template_document.close()
  rendered_document.close()

With this you have normal dosage of cialis your Microsoft word templates and all you need to do is provide a dictionary with the place holders and their values in the replacements dictionary. The place holders should be unique per document and generally not something you would find in the document more than once.  I generally follow the convention [[place holder 1]], [[place holder 2]], …. ect so more generally [[unique word/place holder]].

This is a good approach but needs to be handled with care. Imagine someone edited one of the place holders whenever you call the function with the correct dictionary the place holder won’t be replaced if it is not the same key in the document.