text:
Wahid Saleh from Netherlands with love
By Arindam Garg | Thursday, Jan 15, 2009 (03:01 pm)
Assam Times: First of all could you please tell us how you spent your early life in Assam and also how you shift to Europe.
I was born and brought up at Jorhat. I attended the lower primary school at Jorhat and then joined the Jorhat Government High School. From Jorhat my father was transferred to Kohima. He was the Principal of Kohima Polytechnic School. I had my matriculation from Kohima Government High School and did my undergraduate study at J.B. College Jorhat. From there I went to study Aircraft Maintenance Engineering at Southern College of Engineering and Technology in Ernakulum in Kerala. The college selected me to join BMW Triebwerkbau GmbH, in Munich, Germany for higher training in Jet Engines. Before I went to Germany, I joined Kalinga Airlines and worked as a trainee. Here I got my first hand experience in DC3, Dakota aircrafts. For few months, I worked as a teacher at the Kohima Government High School. In November 1963, I left Bombay by ship and after 14 day-long travel reached Genoa in Italy. From there we took the train and travelling through Switzerland we arrived in Munich in one of the coldest winters of Europe. In Germany, I not only got my training in Jet-engines but I also leant how to survive in an alien environment, amidst a totally different work culture and above all without knowing the local language. Anyway I survived. From Munich I went to Hamburg to work with the Lufthansa German Airlines. There I came in contact with numerical controlled machines and data processing. I joined evening classes to study computer programming in languages like Basic, Cobol, Fortran, Algol, etc. and IT Management.
In Germany I wanted to change my profession from Aircraft Maintenance Engineering to IT. But I could not get the residence permit to work in the IT sector. So through a "Head Hunter", I applied for an IT job in the Netherlands and moved to the Netherlands in 1968.
Saleh with the mayor of Berkel en Rodenrijs receiving his royal award. Photo by Hoffman
25 years jubilium with the same company. A present received from his collogues. In the bacground his wife Hannie.
Ridder Oranje Nassau_The medallion
Flyer introducing Sattriya dancer Vedajyoti Ozah. Milan Festival, The Hague, July 2007
Milan 2007: with Sattriya dance participants at Milan Festival, The Hague, July 2007
Grandchildren with the grandparents
AT: Why you applied for a job in Netherlands?
One of the reasons I applied for a job in the Netherlands was that as a student from India I was corresponding with a medical student from the Netherlands and she wanted to continue her study to become a medical specialist.
AT: You are the first one of the Assamese to be sent for training in Jet engines. Now tell us how did your career progress?
In those days in India we had aircrafts with propeller driven engines. I remember the Lockheed Constellation, affectionately known as the "Connie", or Super Connie. It was a four-engine propeller-driven aircraft built by Lockheed. Then there was the turbo-prop Fokker's Friendship aircrafts used in the Kolkata – Assam sector. The Boeing 707 entered commercial services in 1958. Air India introduced the first 707 with jet engines in 1960. At that time there was no possibility in India to get training in commercially used Jet engines. If I remember correctly, in those days, there were only two institutions in India to study Aircraft Maintenance Engineering. One was at Dumdum airport and the other was at Kerala. One of the newspapers published from Kolkata, reported that I was the first Assamese to be sent for training in Jet engines. As India introduced commercial aircrafts with Jet engines in 1960, it is very well possible that I was the first Assamese who got an opportunity to go abroad for higher training in this subject.
AT: How your inclination to work in social activities in Netherlands start?
In comparison with Germany, life in the Netherlands was very comfortable. In the aircraft maintenance division of an airline, some of the employees have to follow a three shifts rooster. In such an environment it is not that easy to follow evening and weekend classes. But I managed. In the Netherlands, it was a job with normal office hours. Another big advantage in the Netherlands was that almost everybody here speaks English.
As a new arrival I got in touch with the Netherlands-India Association. It is one of the oldest cultural associations of the Netherlands, established in April 1954. I became an active member and then got elected to the Board. During this period I came in contact with the diplomats of the Indian Embassy and other India centric organizations. I got involved with different social and cultural organizations and started my contacts with the Dutch local and central government offices. Slowly Indians discovered the Netherlands and started coming to the Netherlands. The new arrivals wanted information about Indian shops, Indian institutions, Hindu temples etc.
The Dutch got interested in yoga and Indian classical music. India was suddenly in. The Dutch school students also got interested in India. The Dutch public contacted me for information. If the Indian Embassy was not able to give answer to questions, they directed the public to contact me. Later the Indian Tourist Office also started informing the public to contact me with their specific questions. That is how I got involved with the socio-cultural activities in the Netherlands. I started writing down the questions and also the answers. This was the foundation of my book called Indiawijzer (Guide to India) which was first published in 1992. It was a small book of 142 pages. The profit of the first edition of the publication, I donated to the Netherlands-India Association. The second edition was published in 1999. It was a book of 412 pages. The profit of this edition, I donated to an educational foundation from Assam. I am now more or less a walking information source on India related subject and a linking pin between different organizations and India.
AT: Tell us some significant work that you and your foundations have done in Netherlands.
To name these… which I initiated or involved with are:
www.indiawijzer.nl: Due to "demand" and request from the Indian community as well as from the Dutch public, I decided to put the information of Indiawijzer on the net. As an IT Manager I had professionals who designed and developed websites under my management. But personally I did not have any experience in web design. But where there is a will, there is also a way. Under the able guidance of Deepraj Das, a young IT specialist from Tezpur, my "Guru in web design", I started designing WebPages in HTML. After 3 years of work and an "investment" of more than 10.000 hours, I have now a website of +3.000 web pages with India-centric information. What is unique in the www.indiawijzer.nl is an agenda of Indian cultural programme in the Netherlands. It is updated almost daily and covers the whole of the Netherlands. It is now accepted as the information source for India related information in the Netherlands. It has also a chapter on North East and Assam.
Payment of Dutch old age pension (AOW) in India: On 1 January 2000, the Dutch Export Restrictions on Benefits Act (BEU) came into effect. Under this Act, pension payments by the Dutch government to people in India would affect the Dutch Old Age pension (AOW) to be paid in India. But if an agreement is concluded between India and the Netherlands before 1 January 2003, the entitlement will remain unchanged after that date. In 2002 I approached the government of India informing about the change of Dutch law and requested the government to do the needful so that rights for the payment of Dutch Old Age pension (AOW) in India continues. In 2005 I submitted a petition signed by the NRI's living in the Netherlands to the Prime Minister of India and other VIP's on this subject followed by regular communications with Indian Embassy and the Dutch government. This agreement will be signed very soon.
Uniform cost of PIO cards for EU countries with a common currency: The cost of a PIO card is Rs. 15,000/-. The Euro is the common currency to the majority of the EU countries. But the cost of a PIO card in Euro's in different European countries of the EU is different. I wrote to the Ministry of Overseas Indian Affairs and requested them to introduce one uniform rate for the EU countries which has a common currency. This issue was also taken up during minister of MOIA's visit to the Netherlands. The minister advised that MOIA is in consultation with the Ministry of Home Affairs and External Affairs regarding the issue of anomaly in the fee structure presently obtaining in the Euro-zone countries of the PIO and OCI cards.
Overseas Citizenship of India (OCI) card in relation to expired passports: The OCI is a life long visa pasted to a foreign passport. Together with the OCI card it is valid also with an expired foreign passport. In the Netherlands the passport issuing authorities punch holes in an expired passport. If requested some Dutch municipalities don't punch any hole on the passport page with the OIC visa pasted on it. I requested the Ministry of Overseas Indian Affairs to issue OCI visa pasted to the OCI booklet just like PIO cards issued in a separate booklet. I also suggested the Ministry to instruct the immigration officials at the international airports in India to accept a passport with holes punched in it. Shri Vayalar Ravi, minister of MOIA replied that they are striving to find a via-media.
OCI card and the Dutch nationality: The new Dutch law does not allow dual nationality. After corresponding for several months and their enquiry through their embassy we were able to convince the Dutch authorities that OCI card does not mean dual nationality. It is only a life long visa to visit India and this should not have any implication to PIOs holding a Dutch passport. This helped to remove some of the prevailing uncertainties regarding accepting OCI card as a life long visa and not as a nationality document issued by India.
Anomalies in the Internet site of MOIA (www.moia.gov.in): A few of the contents in the country profile of the Netherlands were not correctly represented. I informed the MOIA that the contents needed updating; which the Ministry updated.
Avoidance of double taxation of inheritance: I corresponded with the Dutch Ministry for Finance to draw their attention to the fact that the Avoidance of Double Taxation agreement signed between the Dutch and Indian government in 1988 did not include the avoidance of double taxation of inheritance. As in the year 2008 they are going to revise the agreement, I requested them to include the same in the new agreement. The Dutch government replied that the Inheritance law of 1956 is now under revision and the new law when implemented will include some provisions in this area.
Friends of India: A number of cultural, trade and commercial organizations are active in the Netherlands devoted to bilateral issues between India and the Netherlands. However, there is no apex group which coordinates activities of these separate groups and more important, in the area of Indo-Dutch relations there is no group which interacts at political level, cutting across the party and interest group lines. As a result a better and comprehensive understanding of problems of India and stimulation of cooperative activities at higher levels, are not facilitated. With a view to tackle these issues I came up with the idea of starting a "Friends of India" group in the Netherlands to be active at the political level. A few discussions with Dutch MPs have already taken place.
Social activities: An African proverb says "A single bracelet does not jingle". So in my life, I realized that in order to be happy and loved you have to get involved with others. For many years I played an integral role in helping people from South Asia, mainly India, to settle down in the Netherlands and to get familiarized with the Dutch way of life. For 19 years I served as a Board Member of the Netherlands-India Association out of which 15 years as a Secretary. I took the initiative to collect data and design the first website of the Netherlands-India Association. I helped and guided the creation of the Dutch Indian Youth Association (DIYA) also.
As a Secretary of the Association I organised art-exhibitions and cultural programmes of well-known Indian artists and coordinated fundraising campaigns for drinking water projects, vocational education etc. I was also responsible for running relief campaigns including, but not limited to, Orissa floods, Gujarat earthquake, floods in Assam and Bihar etc. As a social entrepreneur I am an active member of the Indian community in and outside The Netherlands. I have served in numerous civic, community and cultural organizations' in various advisory and executive positions. Last year I was able to introduce Satriya dance in the Netherlands. I am indebted to both Indian as well as the Dutch society. It is always a pleasure to be able to give back a considerable amount of time and energy to the work of the voluntary and charitable organizations. Back home I left my dear and near ones. I had to find new ones in this country. I followed what the Old Testament said "Better a neighbor who is near than a brother who is far away". George Bernard Shaw once said – "I am of the opinion that my life belongs to the community, and as long as I live it is my privilege to do for it whatever I can". I also wanted to do something for the community. I wanted to accept the challenges in a foreign land, wanted to give a helping hand in social activities and not just sit on the fence and remain a finger pointer.
AT: You have won a lot of awards including the Order of Orange & Nassau in Netherlands, Prabhashi Bharatiya Community Service Award etc.. How does it feel? Which award was the most touching?
It's a remarkable feeling. It is one of the highlights of my life. It is an unexpected honour to learn that I received an award. You work hard every day but sometimes wonder if anybody notices. It is honour even to be recommended for an award. When you receive an award, it gives you a feeling that you are respected and recognized. When you receive an award it means the people definitely notice! Being celebrated at the ceremony is also a special honour. At the award ceremony when I learn about the achievements of other recipients, I feel intensely proud and privileged to be included in the group. Each and every award is of importance. The Indian community honoured me in 1998 with the "The Golden Jubilee Community Service Award". So far I am the only person to receive this award. It was quite an honour. In April 2002 I was awarded the coveted Dutch honour, Ridder in de Orde van Oranje-Nassau or the Knighthood of the Order of Orange-Nassau. It was presented on the occasion of the queen's birthday. For an Indian national it was a rare honour to receive this award, which is normally given only to Dutch nationals who have made distinguished contributions to socio-economic life in the Netherlands. I was chosen for the award for my efforts in the promotion of multicultural activities in the country. It is honour even to be recommended for an award.
At times, due to strings attached, I have also declined to receive awards like Hind Rattan, The Global Excellence Award, Rashtriya Ratan Millennium Award, Glory of India Award, etc.
AT: What is your comment on Indian democracy in view of the current political situation is said to be a fluid one specially at a time when there has been an allegation these days that everything in Indian democracy is for sale?
With more than a billion people, the Republic of India is the world's largest democracy. In spite of poverty, considerable illiteracy and diversity on a sub-continental scale, it is still is a democracy. Democratic procedures go down to the village level. Indian government has decentralized several administrative functions, empowering elected gram panchayats to govern at the village level. This is something special. But the question is what type of democracy we have in India when ethnic and other identities like religion or language determine the voting process where a right of the group is more important than individual rights?
After the terrorist attacks in Mumbai the city elite and intellectuals were blaming the politicians. At the same time voters have turned up in unprecedented numbers to cast their ballots in elections to local assemblies in six states. And whom did they elect?
According to a study conducted by National Election Watch as many as 125 candidates with criminal records have won in assembly elections in December 2008. There are several candidates who have cases of serious criminal charges such as murder, attempt to murder and kidnapping against them. Affidavits submitted by the candidates showed that the total number of candidates with criminal records who contested the assembly elections were 549.
I think it was in a speech in 1999 our former Prime Minister Atal Behari Vajpayee said that despite the outward appearance of health, Indian democracy appears to have become hollow, with elections reduced to a farce and the "party system eroded due to unethical practices." According to Vajpayee, "The outer shell of democracy is, no doubt, intact, but appears to be moth-eaten from inside." Vajpayee wondered whether democracy had truly taken root in India. "How can democratic institutions work properly," he asked, "when politics is becoming increasingly criminalized?"
In the light of the above, personally I have my own opinion of our democracy. There is enough room for improvement. But still I am proud of it as it is still working and keeping India in one piece. Indeed India is the largest democracy. But is there freedom for all? According to the law all are equal in India. But due to the all compassing caste systems prevailing in our society, some people are more equal then the others. Otherwise we would not have 780 million Dalits, many of them still fighting at the lowest ladder of the society. Many of them are not allowed visiting the temples frequented by the upper caste or draw water from the village well.
As I have already said, there is no real freedom. Sometimes you even cannot choose different policies and different political parties and elect different leaders as the same set of leaders keep changing parties. An extraordinary growth of regional parties, coupled with defection politics and political infighting, the legitimization of criminal elements in the parliament and the State legislatures have compelled us to lose our faith in the ballot-box. The wheels of the electoral politics run on unaccounted money. This was also telecast live from the Indian parliament where three MPs pulled out bundles of notes to show that they were given to change party. The shocking statistic of vote for cash in Karnataka was highlighted in a study conducted by the Delhi-based NGO, Centre for Media Studies, titled 'Alarming trend of purchasing voters'. Karnataka tops the country in voters being bribed to cast their vote in favour of a particular political party for money.
Another disturbing factor in Indian democracy is the use of populism in the political arena. It is a growing force in India, posing as "senas" or savior of local culture, generally operating as fronts for political parties to carry out their dirty jobs. Some of them will work for the highest bidders. Many of us have experienced corrupt bureaucracy and complain about it. But we have no ideas on removing this evil.
There is a rise of extremist ideologies, regional chauvinism, Islamic and Hindu fundamentalism, exploitation and communalism. There is no fatwas in the Hindu religion. But in 2001 the fundamentalist groups succeeded in preventing the circulation of the book "The Myth of the Holy Cow", by Prof. D.N. Jha. A custodian of Hinduism even sentenced the author to death. The book was ultimately published outside India. In 2004, the government of Maharashtra banned the book "Shivaji: Hindu King of Islamic India" by US academic James W Laine. On January 5, 2004, in the name of protecting the image of Shivaji, large scale violence was unleashed by a mob resulting in the destruction of properties, valuable books. They ransacked the Bhandarkar Oriental Research Institute in Pune and destroyed valuable collections. Maqbool Fida Husain, India's most famous living artist was banned by Hindu fundamentalist groups from exhibiting his work in Delhi as they were enraged by his paintings of nude gods and goddesses. But they all go on a pilgrimage to see the erotic sculptures of the sun temples of Khajuraho. We have seen what Raj Thackery did to North Indians. After the attack in Mumbai we have seen how Shiva Senas ransacked the properties of the lawyers who wanted to defend the terrorist. This is what I mean by - there is no freedom in our democracy.
Among the intellectuals of India, in their discussion I think four subjects dominates – cricket, cinema, corrupt politicians and corrupt system. In spite of all its drawbacks, Indian democracy was and still is a secular democracy and a republic with its States enjoying a good measure of autonomy, is still vibrant. There is a silent majority which upholds the values of democracy. Unlike our neighbouring countries, Indian democracy is not dominated by its religious leaders and the armed forces. We still sing with full conviction – Sare Jahan se Asha, Hindustan Hamara. Abroad, we are not Assamese, Bengali, Marathi or Punjabi. We are all Indians.
AT: In one of your papers that you presented in the staff college at Khanapara, you had mentioned that the word Assam is a brand now. If you can elaborate on this.
In one of my articles on the issue of name change from Assam to Asom I mentioned that Assam is a "brand name". Tea is associated with Assam. Assam is known all over the world for its finest tea. Even the Chief Minister Tarun Gogoi on 20th May 2006 assertively said in a press conference at Guwahati that the State Government would take up the issue of giving State's tea a special brand name -- Assam Tea, with the Central Government. Assam Oil is also a brand name. The first successful mechanically drifted oil well in Asia was at Nahorpung near Digboi, Assam in 1867. It was barely seven years after Col. Drake's first well in Pennsylvania, USA. Asia's first oil refinery in Assam went on stream in 1901 and today the world's oldest operating oil refinery in Assam is still producing. In the world of textile Assam silk has also a place. Besides having 820 species of birds (highest for any Indian state) Assam is an established name amongst the ornithologists. Changing the name of Assam may only marginalise whatever little name recognition the Assamese have in the world today.
AT: What do you feel about the existing political scenario in Assam? What can be done in the state?
Wahid: I have already given you some of my thoughts on Indian democracy. It also applies to Assam. In the past few years, I have not come across any politician from Assam with vision for the development of the State. Otherwise Assam would not have earned the dubious distinction of being the most corrupt State in the country, on the basis of corruption in 11 vital services. We need politicians with leadership qualities, with ideas, policies, motivation and action to set right the flaws in Assam's institutions of governance. The politician should be made accountable to their election promises.
Since decades we are clamoring about the illegal immigrants. Did any politicians come forward with an action plan? How do we ensure that candidates with criminal records are kept out of the electoral arena? I understand even we have a MP from Assam who is not born in India and has a criminal record. The education minister was arrested for bribery. Democracy does not come about simply by holding elections.
AT: We understand that you are involved in some charitable and other projects in Assam. Do you have advice on this?
Wahid: In a small way I am involved with a few projects in Assam. My wife and I had a dream that after our retirement we shall return to Assam. We bought properties. The working life is behind us. Now we are enjoying the fruits of our labour. In the autumn of our lives, we can look back. Our children are settled in the Netherlands. We realized that we shall not be going back to settle in Assam. So we sold our properties and established a charitable trust in the name of my parents. The aim of the trust is to give financial assistance to needy students from the socially weaker section of our society. My wife supports the Matoekoe project in Suriname. Suriname was a Dutch colony in South America. Matoekoe is a curative education centre for children with a mental disability. We also try to support Parijat Academy and Prajnalaya.
AT: Your advise to the young generation and people of Assam.
I belong to a different generation. Hence I don't think I have the right baggage to give advice to the present generation who has different sets of expectations and have to face new type of challenges. I can mention a few of the important points which were handed down to me by my elders and friends and which I picked up during my travel through different roads. They are:
Firstly, don't worry about what the society expects from you. Be true to yourself, your beliefs and your values. You have to live your life and do something that has some meaning to you. It is not easy to follow and fulfill your own dreams. But it is very satisfying.
Secondly, In the world there were no short cuts to success nor in future there will be. One has to work very hard to achieve ones goal. Don't believe that you are entitled to something. You have to earn what you get.
In third place, You should do work that you love to do not what others expects you to do. You should do something because you love doing it.
My Fourth suggestion: Don't ever stop learning. Everything you do in life is short-lived, transitory. You should have the courage to stand behind your conviction and move away from following the crowd. Be humble and recognize what you have.
In fifth place, do one thing at a time. To start with do little things at a time that makes you proud of yourself. You will have faith in your capacity when you have a few achievements to your credit – however small and insignificant they might be. This will make you accepted, respected and welcome.
Finally, My grandfather used to say money lost, you can earn back. But name tarnished is very difficult to clear. It is still valid.
Arindam Garg, Associate Professor and Head, Department of Management, Rajiv Gandhi University, Arunachal Pradesh.
Permalink Submitted by Dr RAVI KOTA on Fri, 16/01/2009 - 00:29
Great and inspiring story of Saleh Sahib for the current generation of all hues in the State, NE and souls from all such locales of this graet Nation.
Permalink Submitted by Dr. B. M. Goswami on Fri, 16/01/2009 - 01:08
Outstanding and extraordinary. Very informative and illuminating. Hope Shri Saleh will keep up the good works he is doing.
Permalink Submitted by Dibya J Borthakur on Fri, 16/01/2009 - 04:18
No words to explain how great the story is ! A quite extraordinary interview I had ever read !
Permalink Submitted by Chinmay Chakravarty on Fri, 16/01/2009 - 05:47
A great success story. That too of the early sixties. Assam needs more and more of success stories. Beacause success inspires success. Success also breeds leaders. Assam needs leaders very urgently. Kudos to Assam Times for this nice presentation.
Permalink Submitted by Neelakshi barua on Sat, 17/01/2009 - 01:19
A truly inspiring personality. I read the entire interview with a lot of pride. Stories about amazing people like Mr Wahid Saleh and the wonderful work that they are involved in, is fascinating. He has done not only the Assamiya society but the entire Indian community proud!!We need more people like him today.
Permalink Submitted by prakash deka on Tue, 20/01/2009 - 17:41
it's heartening to note, how one can do the unthinkable when there is a strong will with a underlying purpose and a need of the hour. Definitely, what Mr. Wahid Saleh has done for the Idians, for the little known (we) Assamese people (inside India) is a great lesson to learn and act for all of us. Thanks for the great contribution.
Permalink Submitted by Bijan Goswami on Tue, 20/01/2009 - 19:33
Saleh da, Your baggage of advice is equally valid now. Rather I would say that it is more required in present day scenario. pls keep the good work. May almighty bestow you with more and more energy to serve the needy ones.
Permalink Submitted by Diganta B Das on Wed, 21/01/2009 - 02:06
Wahid da, Nice to see you here. Liked the pic with your grandchildren.. - Diganta
Permalink Submitted by prakash deka on Thu, 22/01/2009 - 01:04
Dear Wahid Sir, I did not know you earlier. Your contributions and your message (in your interview) have made me your admirer as the "true son of Assam", who made tiny souls like me proud at this remote corner as your noble efforts have made us known to the world. Please, Keep the noble effort on. It inspires us at Assam. You trully is one of the "Assam Ratna" that I want to see to be falicitated by the people of Assam.
Permalink Submitted by Debajeet Boruah on Thu, 22/01/2009 - 13:51
Dear Sir, I feel proud to be from the same native place and the same school i.e. Jorhat Govt. Boys' HS School and feel inspired by your great deeds. May you reach greater heights and bring more laurels to Assam & India.
Permalink Submitted by Anupam Kakati on Fri, 23/01/2009 - 04:39
It is indeed a inspiring story. The five advices that you gave at the end is really nice.
Permalink Submitted by Mozahedul Haque on Fri, 23/01/2009 - 17:07
Dear Sir, It is Inspiring Story. I want to make a News Item in ASOMIYA KHABAR,Published from Guwahati and Jorhat. Thank You Mozahedul Haque, Senior Journalist Asomiya Khabar,Kalapahar,Guwahati-781 019
Permalink Submitted by M Palleti on Sun, 25/01/2009 - 14:09
Wahid da: You have an astounding biography! You make India and Assam proud! Sincerely. Mohan R. Palleti
Permalink Submitted by aradhana das on Mon, 02/02/2009 - 03:16
Never read such an interesting and educative article/interview before.Hope God gives you long and happy life with inspiration to write more.
Permalink Submitted by Ankur Bora on Tue, 03/02/2009 - 15:57
Please read the following about Wahid Saleh http://www.posoowa.org/download/december2008.pdf
Permalink Submitted by Nabajyoti Goswami on Wed, 25/03/2009 - 18:07
A very nice and inspiring story,As an assamese,I feel proud for that and hope it will inspire our generation to take such different path than others.
Permalink Submitted by Naveen Gupta on Wed, 27/05/2009 - 13:50
Respected Wahid ji, My heartfelt gratitude for the wonderful work you are doing here in The Netherlands to let dutch people and Nederland comunity at large understand true picture of democratic and secular India irrespective of caste, creed, race, colour and religion. Sare Jahan se achcha Hindustan Hamara Hamara... Hum Bulbule hain iske Yeh Gulsitan Hamara Hamara... Majhab nahin sikhata aapas mein bair rakhna.... We are proud to be from land of Mahatama Gandhi, Mother Teresa, Netaji Subhash Chandra Bose, Swami Vivekananda, Maulana Azad, His Holiness Maharishi Mahesh Yogi ji, His Holiness Sri Sri Ravi Shanker ji, Hakim Ajmal Khan Sahib ji and many more... I happened to study Ayurvedic Medicine at Ayurvedic and Unani Tibbia College which was established in 1928 by Mahatama Gandhi and Hakim Ajmal Khan for Hindu-Muslim Kaumi Ekta in the field of Medicine. Sincerely yours Naveen Gupta
Permalink Submitted by Dr.Sadiqul Hussain on Tue, 23/02/2010 - 02:26
Respected Sir,Salam aalaikum, Your life and activty inspiring us all here. I agree with Deka that you trully is one of the "Assam Ratna".
Permalink Submitted by Sanjib Sharma on Sat, 15/01/2011 - 00:17
Respected Wahidji I have just gone through your legendery speech on Prabashi Bharatia Divas and I, myself feel proud to be an Assamese.It is the greatest inspiring speech I ever heard and will surely remark an impect on entire young generation.You are the legend wahidji....
Permalink Submitted by uday on Mon, 07/02/2011 - 03:34
Hello sir,its great pleasure to see you in newslife talk show with wasbir hussain. i have no idea about you but when i saw the programme in newslife i switch off the t.v and i open my laptop and i search your name in google.Really i feel proud myself as an assamese. thanks sir
Animal husbandry training in Nazira
7 Sep 2014 - 10:25am | SK Hasan
The Nazira Pragati organised a day long training on animal husbandry which evoked encouraging response from the local residents on Saturday. Sivasagar KVK specialist Dr.Rofikul Islam conducted...
How peace talks and trial can go on together?
11 Dec 2017 - 3:36pm | AT News
GUWAHATI: Can peace process and trial by court go on together? Ranjan Daimary finds it strange to have observed. The pro talk NDFB chairman told it to the reporters as he came to appear...
Kidnapped trader still clueless
9 Sep 2016 - 3:31pm | AT News
Security forces are fanning in the nook and corner of Karbi Anglong district in search of Zakir Hussain whom the miscreants kidnapped at gunpoint in Karbi Anglong district on Thursday. Police and...
The aftermath of examination results
Back2music: A unique concept. (www.back2music.in)
MBA as a career option
Soft Skills and its significance for the students of North-east India.
ASSAM'S ALL ROUNDER – ELI AHMED.
Dr Minati Hazarika wins Sarat Charcha Puraskar Award
The changes in the Banking Clerical Examinations
The changing face of night life in Guwahati and its consequences


text:
Q: How do I export UIImage array as a movie? I have a serious problem: I have an NSArray with several UIImage objects. What I now want to do, is create movie from those UIImages. But I don't have any idea how to do so.
I hope someone can help me or send me a code snippet which does something like I want.
Edit: For future reference - After applying the solution, if the video looks distorted, make sure the width of the images/area you are capturing is a multiple of 16. Found after many hours of struggle here:
Why does my movie from UIImages gets distorted?
Here is the complete solution (just ensure width is multiple of 16)
http://codethink.no-ip.org/wordpress/archives/673

A: Just translated @Scott Raposa answer to swift3 (with some very little changes):
import AVFoundation
import UIKit
import Photos

struct RenderSettings {

    var size : CGSize = .zero
    var fps: Int32 = 6   // frames per second
    var avCodecKey = AVVideoCodecH264
    var videoFilename = "render"
    var videoFilenameExt = "mp4"

    var outputURL: URL {
        // Use the CachesDirectory so the rendered video file sticks around as long as we need it to.
        // Using the CachesDirectory ensures the file won't be included in a backup of the app.
        let fileManager = FileManager.default
        if let tmpDirURL = try? fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) {
            return tmpDirURL.appendingPathComponent(videoFilename).appendingPathExtension(videoFilenameExt)
        }
        fatalError("URLForDirectory() failed")
    }
}

class ImageAnimator {

    // Apple suggests a timescale of 600 because it's a multiple of standard video rates 24, 25, 30, 60 fps etc.
    static let kTimescale: Int32 = 600

    let settings: RenderSettings
    let videoWriter: VideoWriter
    var images: [UIImage]!

    var frameNum = 0

    class func saveToLibrary(videoURL: URL) {
        PHPhotoLibrary.requestAuthorization { status in
            guard status == .authorized else { return }

            PHPhotoLibrary.shared().performChanges({
                PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL)
            }) { success, error in
                if !success {
                    print("Could not save video to photo library:", error)
                }
            }
        }
    }

    class func removeFileAtURL(fileURL: URL) {
        do {
            try FileManager.default.removeItem(atPath: fileURL.path)
        }
        catch _ as NSError {
            // Assume file doesn't exist.
        }
    }

    init(renderSettings: RenderSettings) {
        settings = renderSettings
        videoWriter = VideoWriter(renderSettings: settings)
//        images = loadImages()
    }

    func render(completion: (()->Void)?) {

        // The VideoWriter will fail if a file exists at the URL, so clear it out first.
        ImageAnimator.removeFileAtURL(fileURL: settings.outputURL)

        videoWriter.start()
        videoWriter.render(appendPixelBuffers: appendPixelBuffers) {
            ImageAnimator.saveToLibrary(videoURL: self.settings.outputURL)
            completion?()
        }

    }

//    // Replace this logic with your own.
//    func loadImages() -> [UIImage] {
//        var images = [UIImage]()
//        for index in 1...10 {
//            let filename = "\(index).jpg"
//            images.append(UIImage(named: filename)!)
//        }
//        return images
//    }

    // This is the callback function for VideoWriter.render()
    func appendPixelBuffers(writer: VideoWriter) -> Bool {

        let frameDuration = CMTimeMake(Int64(ImageAnimator.kTimescale / settings.fps), ImageAnimator.kTimescale)

        while !images.isEmpty {

            if writer.isReadyForData == false {
                // Inform writer we have more buffers to write.
                return false
            }

            let image = images.removeFirst()
            let presentationTime = CMTimeMultiply(frameDuration, Int32(frameNum))
            let success = videoWriter.addImage(image: image, withPresentationTime: presentationTime)
            if success == false {
                fatalError("addImage() failed")
            }

            frameNum += 1
        }

        // Inform writer all buffers have been written.
        return true
    }

}

class VideoWriter {

    let renderSettings: RenderSettings

    var videoWriter: AVAssetWriter!
    var videoWriterInput: AVAssetWriterInput!
    var pixelBufferAdaptor: AVAssetWriterInputPixelBufferAdaptor!

    var isReadyForData: Bool {
        return videoWriterInput?.isReadyForMoreMediaData ?? false
    }

    class func pixelBufferFromImage(image: UIImage, pixelBufferPool: CVPixelBufferPool, size: CGSize) -> CVPixelBuffer {

        var pixelBufferOut: CVPixelBuffer?

        let status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, pixelBufferPool, &pixelBufferOut)
        if status != kCVReturnSuccess {
            fatalError("CVPixelBufferPoolCreatePixelBuffer() failed")
        }

        let pixelBuffer = pixelBufferOut!

        CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

        let data = CVPixelBufferGetBaseAddress(pixelBuffer)
        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: data, width: Int(size.width), height: Int(size.height),
                                bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)

        context!.clear(CGRect(x:0,y: 0,width: size.width,height: size.height))

        let horizontalRatio = size.width / image.size.width
        let verticalRatio = size.height / image.size.height
        //aspectRatio = max(horizontalRatio, verticalRatio) // ScaleAspectFill
        let aspectRatio = min(horizontalRatio, verticalRatio) // ScaleAspectFit

        let newSize = CGSize(width: image.size.width * aspectRatio, height: image.size.height * aspectRatio)

        let x = newSize.width < size.width ? (size.width - newSize.width) / 2 : 0
        let y = newSize.height < size.height ? (size.height - newSize.height) / 2 : 0

        context?.draw(image.cgImage!, in: CGRect(x:x,y: y, width: newSize.width, height: newSize.height))
        CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

        return pixelBuffer
    }

    init(renderSettings: RenderSettings) {
        self.renderSettings = renderSettings
    }

    func start() {

        let avOutputSettings: [String: Any] = [
            AVVideoCodecKey: renderSettings.avCodecKey,
            AVVideoWidthKey: NSNumber(value: Float(renderSettings.size.width)),
            AVVideoHeightKey: NSNumber(value: Float(renderSettings.size.height))
        ]

        func createPixelBufferAdaptor() {
            let sourcePixelBufferAttributesDictionary = [
                kCVPixelBufferPixelFormatTypeKey as String: NSNumber(value: kCVPixelFormatType_32ARGB),
                kCVPixelBufferWidthKey as String: NSNumber(value: Float(renderSettings.size.width)),
                kCVPixelBufferHeightKey as String: NSNumber(value: Float(renderSettings.size.height))
            ]
            pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: videoWriterInput,
                                                                      sourcePixelBufferAttributes: sourcePixelBufferAttributesDictionary)
        }

        func createAssetWriter(outputURL: URL) -> AVAssetWriter {
            guard let assetWriter = try? AVAssetWriter(outputURL: outputURL, fileType: AVFileTypeMPEG4) else {
                fatalError("AVAssetWriter() failed")
            }

            guard assetWriter.canApply(outputSettings: avOutputSettings, forMediaType: AVMediaTypeVideo) else {
                fatalError("canApplyOutputSettings() failed")
            }

            return assetWriter
        }

        videoWriter = createAssetWriter(outputURL: renderSettings.outputURL)
        videoWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: avOutputSettings)

        if videoWriter.canAdd(videoWriterInput) {
            videoWriter.add(videoWriterInput)
        }
        else {
            fatalError("canAddInput() returned false")
        }

        // The pixel buffer adaptor must be created before we start writing.
        createPixelBufferAdaptor()

        if videoWriter.startWriting() == false {
            fatalError("startWriting() failed")
        }

        videoWriter.startSession(atSourceTime: kCMTimeZero)

        precondition(pixelBufferAdaptor.pixelBufferPool != nil, "nil pixelBufferPool")
    }

    func render(appendPixelBuffers: ((VideoWriter)->Bool)?, completion: (()->Void)?) {

        precondition(videoWriter != nil, "Call start() to initialze the writer")

        let queue = DispatchQueue(label: "mediaInputQueue")
        videoWriterInput.requestMediaDataWhenReady(on: queue) {
            let isFinished = appendPixelBuffers?(self) ?? false
            if isFinished {
                self.videoWriterInput.markAsFinished()
                self.videoWriter.finishWriting() {
                    DispatchQueue.main.async {
                        completion?()
                    }
                }
            }
            else {
                // Fall through. The closure will be called again when the writer is ready.
            }
        }
    }

    func addImage(image: UIImage, withPresentationTime presentationTime: CMTime) -> Bool {

        precondition(pixelBufferAdaptor != nil, "Call start() to initialze the writer")

        let pixelBuffer = VideoWriter.pixelBufferFromImage(image: image, pixelBufferPool: pixelBufferAdaptor.pixelBufferPool!, size: renderSettings.size)
        return pixelBufferAdaptor.append(pixelBuffer, withPresentationTime: presentationTime)
    }

}

A: Here's the swift3 version how to convert Images array to the Video
import Foundation
import AVFoundation
import UIKit

typealias CXEMovieMakerCompletion = (URL) -> Void
typealias CXEMovieMakerUIImageExtractor = (AnyObject) -> UIImage?

public class ImagesToVideoUtils: NSObject {

    static let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    static let tempPath = paths[0] + "/exprotvideo.mp4"
    static let fileURL = URL(fileURLWithPath: tempPath)
//    static let tempPath = NSTemporaryDirectory() + "/exprotvideo.mp4"
//    static let fileURL = URL(fileURLWithPath: tempPath)

    var assetWriter:AVAssetWriter!
    var writeInput:AVAssetWriterInput!
    var bufferAdapter:AVAssetWriterInputPixelBufferAdaptor!
    var videoSettings:[String : Any]!
    var frameTime:CMTime!
    //var fileURL:URL!

    var completionBlock: CXEMovieMakerCompletion?
    var movieMakerUIImageExtractor:CXEMovieMakerUIImageExtractor?

    public class func videoSettings(codec:String, width:Int, height:Int) -> [String: Any]{
        if(Int(width) % 16 != 0){
            print("warning: video settings width must be divisible by 16")
        }

        let videoSettings:[String: Any] = [AVVideoCodecKey: AVVideoCodecJPEG, //AVVideoCodecH264,
                                           AVVideoWidthKey: width,
                                           AVVideoHeightKey: height]

        return videoSettings
    }

    public init(videoSettings: [String: Any]) {
        super.init()

        if(FileManager.default.fileExists(atPath: ImagesToVideoUtils.tempPath)){
            guard (try? FileManager.default.removeItem(atPath: ImagesToVideoUtils.tempPath)) != nil else {
                print("remove path failed")
                return
            }
        }

        self.assetWriter = try! AVAssetWriter(url: ImagesToVideoUtils.fileURL, fileType: AVFileTypeQuickTimeMovie)

        self.videoSettings = videoSettings
        self.writeInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings)
        assert(self.assetWriter.canAdd(self.writeInput), "add failed")

        self.assetWriter.add(self.writeInput)
        let bufferAttributes:[String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32ARGB)]
        self.bufferAdapter = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: self.writeInput, sourcePixelBufferAttributes: bufferAttributes)
        self.frameTime = CMTimeMake(1, 5)
    }

    func createMovieFrom(urls: [URL], withCompletion: @escaping CXEMovieMakerCompletion){
        self.createMovieFromSource(images: urls as [AnyObject], extractor:{(inputObject:AnyObject) ->UIImage? in
            return UIImage(data: try! Data(contentsOf: inputObject as! URL))}, withCompletion: withCompletion)
    }

    func createMovieFrom(images: [UIImage], withCompletion: @escaping CXEMovieMakerCompletion){
        self.createMovieFromSource(images: images, extractor: {(inputObject:AnyObject) -> UIImage? in
            return inputObject as? UIImage}, withCompletion: withCompletion)
    }

    func createMovieFromSource(images: [AnyObject], extractor: @escaping CXEMovieMakerUIImageExtractor, withCompletion: @escaping CXEMovieMakerCompletion){
        self.completionBlock = withCompletion

        self.assetWriter.startWriting()
        self.assetWriter.startSession(atSourceTime: kCMTimeZero)

        let mediaInputQueue = DispatchQueue(label: "mediaInputQueue")
        var i = 0
        let frameNumber = images.count

        self.writeInput.requestMediaDataWhenReady(on: mediaInputQueue){
            while(true){
                if(i >= frameNumber){
                    break
                }

                if (self.writeInput.isReadyForMoreMediaData){
                    var sampleBuffer:CVPixelBuffer?
                    autoreleasepool{
                        let img = extractor(images[i])
                        if img == nil{
                            i += 1
                            print("Warning: counld not extract one of the frames")
                            //continue
                        }
                        sampleBuffer = self.newPixelBufferFrom(cgImage: img!.cgImage!)
                    }
                    if (sampleBuffer != nil){
                        if(i == 0){
                            self.bufferAdapter.append(sampleBuffer!, withPresentationTime: kCMTimeZero)
                        }else{
                            let value = i - 1
                            let lastTime = CMTimeMake(Int64(value), self.frameTime.timescale)
                            let presentTime = CMTimeAdd(lastTime, self.frameTime)
                            self.bufferAdapter.append(sampleBuffer!, withPresentationTime: presentTime)
                        }
                        i = i + 1
                    }
                }
            }
            self.writeInput.markAsFinished()
            self.assetWriter.finishWriting {
                DispatchQueue.main.sync {
                    self.completionBlock!(ImagesToVideoUtils.fileURL)
                }
            }
        }
    }

    func newPixelBufferFrom(cgImage:CGImage) -> CVPixelBuffer?{
        let options:[String: Any] = [kCVPixelBufferCGImageCompatibilityKey as String: true, kCVPixelBufferCGBitmapContextCompatibilityKey as String: true]
        var pxbuffer:CVPixelBuffer?
        let frameWidth = self.videoSettings[AVVideoWidthKey] as! Int
        let frameHeight = self.videoSettings[AVVideoHeightKey] as! Int

        let status = CVPixelBufferCreate(kCFAllocatorDefault, frameWidth, frameHeight, kCVPixelFormatType_32ARGB, options as CFDictionary?, &pxbuffer)
        assert(status == kCVReturnSuccess && pxbuffer != nil, "newPixelBuffer failed")

        CVPixelBufferLockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0))
        let pxdata = CVPixelBufferGetBaseAddress(pxbuffer!)
        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: pxdata, width: frameWidth, height: frameHeight, bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pxbuffer!), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
        assert(context != nil, "context is nil")

        context!.concatenate(CGAffineTransform.identity)
        context!.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height))
        CVPixelBufferUnlockBaseAddress(pxbuffer!, CVPixelBufferLockFlags(rawValue: 0))
        return pxbuffer
    }
}

I use it together with screen capturing, to basically create a video of screen capturing, here's the full story/complete example.

A: Update To Swift 5
Last week I set out to write the iOS code to generate a video from images. I had a little bit of AVFoundation experience, but had never even heard of a CVPixelBuffer. I came across the answers on this page and also here. It took several days to dissect everything and put it all back together in Swift in a way that made sense to my brain. Below is what I came up with.
NOTE: If you copy/paste all the code below into a single Swift file, it should compile. You'll just need to tweak loadImages() and the RenderSettings values.
Part 1: Setting things up
Here I group all the export-related settings into a single RenderSettings struct.
import AVFoundation
import UIKit
import Photos

struct RenderSettings {

var size : CGSize = .zero
var fps: Int32 = 6   // frames per second
var avCodecKey = AVVideoCodecType.h264
var videoFilename = "render"
var videoFilenameExt = "mp4"

var outputURL: URL {
    // Use the CachesDirectory so the rendered video file sticks around as long as we need it to.
    // Using the CachesDirectory ensures the file won't be included in a backup of the app.
    let fileManager = FileManager.default
    if let tmpDirURL = try? fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) {
        return tmpDirURL.appendingPathComponent(videoFilename).appendingPathExtension(videoFilenameExt)
    }
    fatalError("URLForDirectory() failed")
}

Part 2: The ImageAnimator
The ImageAnimator class knows about your images and uses the VideoWriter class to perform the rendering. The idea is to keep the video content code separate from the low-level AVFoundation code. I also added saveToLibrary() here as a class function which gets called at the end of the chain to save the video to the Photo Library.
class ImageAnimator {

// Apple suggests a timescale of 600 because it's a multiple of standard video rates 24, 25, 30, 60 fps etc.
static let kTimescale: Int32 = 600

let settings: RenderSettings
let videoWriter: VideoWriter
var images: [UIImage]!

var frameNum = 0

class func saveToLibrary(videoURL: URL) {
    PHPhotoLibrary.requestAuthorization { status in
        guard status == .authorized else { return }

        PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL)
        }) { success, error in
            if !success {
                print("Could not save video to photo library:", error)
            }
        }
    }
}

class func removeFileAtURL(fileURL: URL) {
    do {
        try FileManager.default.removeItem(atPath: fileURL.path)
    }
    catch _ as NSError {
        // Assume file doesn't exist.
    }
}

init(renderSettings: RenderSettings) {
    settings = renderSettings
    videoWriter = VideoWriter(renderSettings: settings)
    //images = loadImages()
}

func render(completion: (()->Void)?) {

    // The VideoWriter will fail if a file exists at the URL, so clear it out first.
    ImageAnimator.removeFileAtURL(fileURL: settings.outputURL)

    videoWriter.start()
    videoWriter.render(appendPixelBuffers: appendPixelBuffers) {
        ImageAnimator.saveToLibrary(videoURL: self.settings.outputURL)
        completion?()
    }

}

// This is the callback function for VideoWriter.render()
func appendPixelBuffers(writer: VideoWriter) -> Bool {

    let frameDuration = CMTimeMake(value: Int64(ImageAnimator.kTimescale / settings.fps), timescale: ImageAnimator.kTimescale)

    while !images.isEmpty {

        if writer.isReadyForData == false {
            // Inform writer we have more buffers to write.
            return false
        }

        let image = images.removeFirst()
        let presentationTime = CMTimeMultiply(frameDuration, multiplier: Int32(frameNum))
        let success = videoWriter.addImage(image: image, withPresentationTime: presentationTime)
        if success == false {
            fatalError("addImage() failed")
        }

        frameNum += 1
    }

    // Inform writer all buffers have been written.
    return true
}

Part 3: The VideoWriter
The VideoWriter class does all AVFoundation heavy lifting. It's mostly a wrapper around AVAssetWriter and AVAssetWriterInput. It also contains fancy code written by not me that knows how to translate an image into a CVPixelBuffer.
class VideoWriter {

let renderSettings: RenderSettings

var videoWriter: AVAssetWriter!
var videoWriterInput: AVAssetWriterInput!
var pixelBufferAdaptor: AVAssetWriterInputPixelBufferAdaptor!

var isReadyForData: Bool {
    return videoWriterInput?.isReadyForMoreMediaData ?? false
}

class func pixelBufferFromImage(image: UIImage, pixelBufferPool: CVPixelBufferPool, size: CGSize) -> CVPixelBuffer {

    var pixelBufferOut: CVPixelBuffer?

    let status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, pixelBufferPool, &pixelBufferOut)
    if status != kCVReturnSuccess {
        fatalError("CVPixelBufferPoolCreatePixelBuffer() failed")
    }

    let pixelBuffer = pixelBufferOut!

    CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

    let data = CVPixelBufferGetBaseAddress(pixelBuffer)
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
    let context = CGContext(data: data, width: Int(size.width), height: Int(size.height),
                            bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)

    context!.clear(CGRect(x:0,y: 0,width: size.width,height: size.height))

    let horizontalRatio = size.width / image.size.width
    let verticalRatio = size.height / image.size.height
    //aspectRatio = max(horizontalRatio, verticalRatio) // ScaleAspectFill
    let aspectRatio = min(horizontalRatio, verticalRatio) // ScaleAspectFit

    let newSize = CGSize(width: image.size.width * aspectRatio, height: image.size.height * aspectRatio)

    let x = newSize.width < size.width ? (size.width - newSize.width) / 2 : 0
    let y = newSize.height < size.height ? (size.height - newSize.height) / 2 : 0

    context?.draw(image.cgImage!, in: CGRect(x:x,y: y, width: newSize.width, height: newSize.height))
    CVPixelBufferUnlockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))

    return pixelBuffer
}

init(renderSettings: RenderSettings) {
    self.renderSettings = renderSettings
}

func start() {

    let avOutputSettings: [String: Any] = [
        AVVideoCodecKey: renderSettings.avCodecKey,
        AVVideoWidthKey: NSNumber(value: Float(renderSettings.size.width)),
        AVVideoHeightKey: NSNumber(value: Float(renderSettings.size.height))
    ]

    func createPixelBufferAdaptor() {
        let sourcePixelBufferAttributesDictionary = [
            kCVPixelBufferPixelFormatTypeKey as String: NSNumber(value: kCVPixelFormatType_32ARGB),
            kCVPixelBufferWidthKey as String: NSNumber(value: Float(renderSettings.size.width)),
            kCVPixelBufferHeightKey as String: NSNumber(value: Float(renderSettings.size.height))
        ]
        pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: videoWriterInput,
                                                                  sourcePixelBufferAttributes: sourcePixelBufferAttributesDictionary)
    }

    func createAssetWriter(outputURL: URL) -> AVAssetWriter {
        guard let assetWriter = try? AVAssetWriter(outputURL: outputURL, fileType: AVFileType.mp4) else {
            fatalError("AVAssetWriter() failed")
        }

        guard assetWriter.canApply(outputSettings: avOutputSettings, forMediaType: AVMediaType.video) else {
            fatalError("canApplyOutputSettings() failed")
        }

        return assetWriter
    }

    videoWriter = createAssetWriter(outputURL: renderSettings.outputURL)
    videoWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: avOutputSettings)

    if videoWriter.canAdd(videoWriterInput) {
        videoWriter.add(videoWriterInput)
    }
    else {
        fatalError("canAddInput() returned false")
    }

    // The pixel buffer adaptor must be created before we start writing.
    createPixelBufferAdaptor()

    if videoWriter.startWriting() == false {
        fatalError("startWriting() failed")
    }

    videoWriter.startSession(atSourceTime: CMTime.zero)

    precondition(pixelBufferAdaptor.pixelBufferPool != nil, "nil pixelBufferPool")
}

func render(appendPixelBuffers: ((VideoWriter)->Bool)?, completion: (()->Void)?) {

    precondition(videoWriter != nil, "Call start() to initialze the writer")

    let queue = DispatchQueue(label: "mediaInputQueue")
    videoWriterInput.requestMediaDataWhenReady(on: queue) {
        let isFinished = appendPixelBuffers?(self) ?? false
        if isFinished {
            self.videoWriterInput.markAsFinished()
            self.videoWriter.finishWriting() {
                DispatchQueue.main.async {
                    completion?()
                }
            }
        }
        else {
            // Fall through. The closure will be called again when the writer is ready.
        }
    }
}

func addImage(image: UIImage, withPresentationTime presentationTime: CMTime) -> Bool {

    precondition(pixelBufferAdaptor != nil, "Call start() to initialze the writer")

    let pixelBuffer = VideoWriter.pixelBufferFromImage(image: image, pixelBufferPool: pixelBufferAdaptor.pixelBufferPool!, size: renderSettings.size)
    return pixelBufferAdaptor.append(pixelBuffer, withPresentationTime: presentationTime)
}

Part 4: Make it happen
Once everything is in place, these are your 3 magic lines:
let settings = RenderSettings()
let imageAnimator = ImageAnimator(renderSettings: settings)
imageAnimator.render() {
    print("yes")
}

A: Here is the latest working code on iOS8 in Objective-C.
We had to make a variety of tweaks to @Zoul's answer above to get it to work on the latest version of Xcode and iOS8.  Here is our complete working code that takes an array of UIImages, makes them into a .mov file, saves it to a temp directory, then moves it to the camera roll. We assembled code from multiple different posts to get this working. We have highlighted the traps we had to solve to get the code working in our comments.
(1) Create a collection of UIImages
[self saveMovieToLibrary]

- (IBAction)saveMovieToLibrary
{
    // You just need the height and width of the video here
    // For us, our input and output video was 640 height x 480 width
    // which is what we get from the iOS front camera
    ATHSingleton *singleton = [ATHSingleton singletons];
    int height = singleton.screenHeight;
    int width = singleton.screenWidth;

    // You can save a .mov or a .mp4 file
    //NSString *fileNameOut = @"temp.mp4";
    NSString *fileNameOut = @"temp.mov";

    // We chose to save in the tmp/ directory on the device initially
    NSString *directoryOut = @"tmp/";
    NSString *outFile = [NSString stringWithFormat:@"%@%@",directoryOut,fileNameOut];
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:outFile]];
    NSURL *videoTempURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), fileNameOut]];

    // WARNING: AVAssetWriter does not overwrite files for us, so remove the destination file if it already exists
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:[videoTempURL path]  error:NULL];

    // Create your own array of UIImages
    NSMutableArray *images = [NSMutableArray array];
    for (int i=0; i<singleton.numberOfScreenshots; i++)
    {
        // This was our routine that returned a UIImage. Just use your own.
        UIImage *image =[self uiimageFromCopyOfPixelBuffersUsingIndex:i];
        // We used a routine to write text onto every image
        // so we could validate the images were actually being written when testing. This was it below.
        image = [self writeToImage:image Text:[NSString stringWithFormat:@"%i",i ]];
        [images addObject:image];
    }

// If you just want to manually add a few images - here is code you can uncomment
// NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/movie.mp4"]];
//    NSArray *images = [[NSArray alloc] initWithObjects:
//                      [UIImage imageNamed:@"add_ar.png"],
//                      [UIImage imageNamed:@"add_ja.png"],
//                      [UIImage imageNamed:@"add_ru.png"],
//                      [UIImage imageNamed:@"add_ru.png"],
//                      [UIImage imageNamed:@"add_ar.png"],
//                      [UIImage imageNamed:@"add_ja.png"],
//                      [UIImage imageNamed:@"add_ru.png"],
//                      [UIImage imageNamed:@"add_ar.png"],
//                      [UIImage imageNamed:@"add_en.png"], nil];

    [self writeImageAsMovie:images toPath:path size:CGSizeMake(height, width)];
}

This is the main method that creates your AssetWriter and adds images to it for writing.
(2) Wire up an AVAssetWriter
-(void)writeImageAsMovie:(NSArray *)array toPath:(NSString*)path size:(CGSize)size
{

    NSError *error = nil;

    // FIRST, start up an AVAssetWriter instance to write your video
    // Give it a destination path (for us: tmp/temp.mov)
    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]
                                                           fileType:AVFileTypeQuickTimeMovie
                                                              error:&error];

    NSParameterAssert(videoWriter);

    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                   AVVideoCodecH264, AVVideoCodecKey,
                                   [NSNumber numberWithInt:size.width], AVVideoWidthKey,
                                   [NSNumber numberWithInt:size.height], AVVideoHeightKey,
                                   nil];

    AVAssetWriterInput* writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
                                                                         outputSettings:videoSettings];

    AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
                                                                                sourcePixelBufferAttributes:nil];
    NSParameterAssert(writerInput);
    NSParameterAssert([videoWriter canAddInput:writerInput]);
    [videoWriter addInput:writerInput];

(3) Start a writing Session (NOTE: the method is continuing from above)
    //Start a SESSION of writing.
    // After you start a session, you will keep adding image frames
    // until you are complete - then you will tell it you are done.
    [videoWriter startWriting];
    // This starts your video at time = 0
    [videoWriter startSessionAtSourceTime:kCMTimeZero];

    CVPixelBufferRef buffer = NULL;

    // This was just our utility class to get screen sizes etc.
    ATHSingleton *singleton = [ATHSingleton singletons];

    int i = 0;
    while (1)
    {
        // Check if the writer is ready for more data, if not, just wait
        if(writerInput.readyForMoreMediaData){

            CMTime frameTime = CMTimeMake(150, 600);
            // CMTime = Value and Timescale.
            // Timescale = the number of tics per second you want
            // Value is the number of tics
            // For us - each frame we add will be 1/4th of a second
            // Apple recommend 600 tics per second for video because it is a
            // multiple of the standard video rates 24, 30, 60 fps etc.
            CMTime lastTime=CMTimeMake(i*150, 600);
            CMTime presentTime=CMTimeAdd(lastTime, frameTime);

            if (i == 0) {presentTime = CMTimeMake(0, 600);}
            // This ensures the first frame starts at 0.

            if (i >= [array count])
            {
                buffer = NULL;
            }
            else
            {
                // This command grabs the next UIImage and converts it to a CGImage
                buffer = [self pixelBufferFromCGImage:[[array objectAtIndex:i] CGImage]];
            }

            if (buffer)
            {
                // Give the CGImage to the AVAssetWriter to add to your video
                [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
                i++;
            }
            else
            {

(4) Finish the Session (Note: Method continues from above)
                //Finish the session:
                // This is important to be done exactly in this order
                [writerInput markAsFinished];
                // WARNING: finishWriting in the solution above is deprecated.
                // You now need to give a completion handler.
                [videoWriter finishWritingWithCompletionHandler:^{
                    NSLog(@"Finished writing...checking completion status...");
                    if (videoWriter.status != AVAssetWriterStatusFailed && videoWriter.status == AVAssetWriterStatusCompleted)
                    {
                        NSLog(@"Video writing succeeded.");

                        // Move video to camera roll
                        // NOTE: You cannot write directly to the camera roll.
                        // You must first write to an iOS directory then move it!
                        NSURL *videoTempURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", path]];
                        [self saveToCameraRoll:videoTempURL];

                    } else
                    {
                        NSLog(@"Video writing failed: %@", videoWriter.error);
                    }

                }]; // end videoWriter finishWriting Block

                CVPixelBufferPoolRelease(adaptor.pixelBufferPool);

                NSLog (@"Done");
                break;
            }
        }
    }
}

(5) Convert your UIImages to a CVPixelBufferRef
This method will give you a CV pixel buffer reference which is needed by the AssetWriter. This is obtained from a CGImageRef which you get from your UIImage (above).
- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
    // This again was just our utility class for the height & width of the
    // incoming video (640 height x 480 width)
    ATHSingleton *singleton = [ATHSingleton singletons];
    int height = singleton.screenHeight;
    int width = singleton.screenWidth;

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                             nil];
    CVPixelBufferRef pxbuffer = NULL;

    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width,
                                          height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
                                          &pxbuffer);

    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef context = CGBitmapContextCreate(pxdata, width,
                                                 height, 8, 4*width, rgbColorSpace,
                                                 kCGImageAlphaNoneSkipFirst);
    NSParameterAssert(context);
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                           CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}

(6) Move Your Video to the Camera Roll
Because AVAssetWriter cannot write directly to the camera roll, this moves the video from "tmp/temp.mov" (or whatever filename you named it above) to the camera roll.
- (void) saveToCameraRoll:(NSURL *)srcURL
{
    NSLog(@"srcURL: %@", srcURL);

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    ALAssetsLibraryWriteVideoCompletionBlock videoWriteCompletionBlock =
    ^(NSURL *newURL, NSError *error) {
        if (error) {
            NSLog( @"Error writing image with metadata to Photo Library: %@", error );
        } else {
            NSLog( @"Wrote image with metadata to Photo Library %@", newURL.absoluteString);
        }
    };

    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:srcURL])
    {
        [library writeVideoAtPathToSavedPhotosAlbum:srcURL
                                    completionBlock:videoWriteCompletionBlock];
    }
}

Zoul's answer above gives a nice outline of what you will be doing. We extensively commented this code so you can then see how it was done using working code.

A: Take a look at AVAssetWriter and the rest of the AVFoundation framework. The writer has an input of type AVAssetWriterInput, which in turn has a method called appendSampleBuffer: that lets you add individual frames to a video stream. Essentially you'll have to:
1) Wire the writer:
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
    [NSURL fileURLWithPath:somePath] fileType:AVFileTypeQuickTimeMovie
    error:&error];
NSParameterAssert(videoWriter);

NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
    AVVideoCodecH264, AVVideoCodecKey,
    [NSNumber numberWithInt:640], AVVideoWidthKey,
    [NSNumber numberWithInt:480], AVVideoHeightKey,
    nil];
AVAssetWriterInput* writerInput = [[AVAssetWriterInput
    assetWriterInputWithMediaType:AVMediaTypeVideo
    outputSettings:videoSettings] retain]; //retain should be removed if ARC

NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];

2) Start a session:
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:…] //use kCMTimeZero if unsure

3) Write some samples:
// Or you can use AVAssetWriterInputPixelBufferAdaptor.
// That lets you feed the writer input data from a CVPixelBuffer
// that's quite easy to create from a CGImage.
[writerInput appendSampleBuffer:sampleBuffer];

4) Finish the session:
[writerInput markAsFinished];
[videoWriter endSessionAtSourceTime:…]; //optional can call finishWriting without specifying endTime
[videoWriter finishWriting]; //deprecated in ios6
/*
[videoWriter finishWritingWithCompletionHandler:...]; //ios 6.0+
*/

You'll still have to fill-in a lot of blanks, but I think that the only really hard remaining part is getting a pixel buffer from a CGImage:
- (CVPixelBufferRef) newPixelBufferFromCGImage: (CGImageRef) image
{
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
        [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
        nil];
    CVPixelBufferRef pxbuffer = NULL;
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
        frameSize.height, kCVPixelFormatType_32ARGB, (CFDictionaryRef) options,
        &pxbuffer);
    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
        frameSize.height, 8, 4*frameSize.width, rgbColorSpace,
        kCGImageAlphaNoneSkipFirst);
    NSParameterAssert(context);
    CGContextConcatCTM(context, frameTransform);
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
        CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}

frameSize is a CGSize describing your target frame size and frameTransform is a CGAffineTransform that lets you transform the images when you draw them into frames.

A: I took Zoul's main ideas and incorporated the AVAssetWriterInputPixelBufferAdaptor method and made the beginnings of a little frameworks out of it.
Feel free to check it out and improve upon it! CEMovieMaker

A: Here's a Swift 2.x version tested on iOS 8. It combines answers from @Scott Raposa and @Praxiteles along with code from @acj contributed for another question. The code from @acj is here: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b. @TimBull also provided code as well.
Like @Scott Raposa, I had never even heard of CVPixelBufferPoolCreatePixelBuffer and several other functions, let alone understood how to use them.
What you see below was cobbled together mostly by trial and error and from reading Apple docs. Please use with caution, and provide suggestions if there are mistakes.
Usage:
import UIKit
import AVFoundation
import Photos

writeImagesAsMovie(yourImages, videoPath: yourPath, videoSize: yourSize, videoFPS: 30)

Code:
func writeImagesAsMovie(allImages: [UIImage], videoPath: String, videoSize: CGSize, videoFPS: Int32) {
    // Create AVAssetWriter to write video
    guard let assetWriter = createAssetWriter(videoPath, size: videoSize) else {
        print("Error converting images to video: AVAssetWriter not created")
        return
    }

    // If here, AVAssetWriter exists so create AVAssetWriterInputPixelBufferAdaptor
    let writerInput = assetWriter.inputs.filter{ $0.mediaType == AVMediaTypeVideo }.first!
    let sourceBufferAttributes : [String : AnyObject] = [
        kCVPixelBufferPixelFormatTypeKey as String : Int(kCVPixelFormatType_32ARGB),
        kCVPixelBufferWidthKey as String : videoSize.width,
        kCVPixelBufferHeightKey as String : videoSize.height,
        ]
    let pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, sourcePixelBufferAttributes: sourceBufferAttributes)

    // Start writing session
    assetWriter.startWriting()
    assetWriter.startSessionAtSourceTime(kCMTimeZero)
    if (pixelBufferAdaptor.pixelBufferPool == nil) {
        print("Error converting images to video: pixelBufferPool nil after starting session")
        return
    }

    // -- Create queue for <requestMediaDataWhenReadyOnQueue>
    let mediaQueue = dispatch_queue_create("mediaInputQueue", nil)

    // -- Set video parameters
    let frameDuration = CMTimeMake(1, videoFPS)
    var frameCount = 0

    // -- Add images to video
    let numImages = allImages.count
    writerInput.requestMediaDataWhenReadyOnQueue(mediaQueue, usingBlock: { () -> Void in
        // Append unadded images to video but only while input ready
        while (writerInput.readyForMoreMediaData && frameCount < numImages) {
            let lastFrameTime = CMTimeMake(Int64(frameCount), videoFPS)
            let presentationTime = frameCount == 0 ? lastFrameTime : CMTimeAdd(lastFrameTime, frameDuration)

            if !self.appendPixelBufferForImageAtURL(allImages[frameCount], pixelBufferAdaptor: pixelBufferAdaptor, presentationTime: presentationTime) {
                print("Error converting images to video: AVAssetWriterInputPixelBufferAdapter failed to append pixel buffer")
                return
            }

            frameCount += 1
        }

        // No more images to add? End video.
        if (frameCount >= numImages) {
            writerInput.markAsFinished()
            assetWriter.finishWritingWithCompletionHandler {
                if (assetWriter.error != nil) {
                    print("Error converting images to video: \(assetWriter.error)")
                } else {
                    self.saveVideoToLibrary(NSURL(fileURLWithPath: videoPath))
                    print("Converted images to movie @ \(videoPath)")
                }
            }
        }
    })
}

func createAssetWriter(path: String, size: CGSize) -> AVAssetWriter? {
    // Convert <path> to NSURL object
    let pathURL = NSURL(fileURLWithPath: path)

    // Return new asset writer or nil
    do {
        // Create asset writer
        let newWriter = try AVAssetWriter(URL: pathURL, fileType: AVFileTypeMPEG4)

        // Define settings for video input
        let videoSettings: [String : AnyObject] = [
            AVVideoCodecKey  : AVVideoCodecH264,
            AVVideoWidthKey  : size.width,
            AVVideoHeightKey : size.height,
            ]

        // Add video input to writer
        let assetWriterVideoInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings)
        newWriter.addInput(assetWriterVideoInput)

        // Return writer
        print("Created asset writer for \(size.width)x\(size.height) video")
        return newWriter
    } catch {
        print("Error creating asset writer: \(error)")
        return nil
    }
}

func appendPixelBufferForImageAtURL(image: UIImage, pixelBufferAdaptor: AVAssetWriterInputPixelBufferAdaptor, presentationTime: CMTime) -> Bool {
    var appendSucceeded = false

    autoreleasepool {
        if  let pixelBufferPool = pixelBufferAdaptor.pixelBufferPool {
            let pixelBufferPointer = UnsafeMutablePointer<CVPixelBuffer?>.alloc(1)
            let status: CVReturn = CVPixelBufferPoolCreatePixelBuffer(
                kCFAllocatorDefault,
                pixelBufferPool,
                pixelBufferPointer
            )

            if let pixelBuffer = pixelBufferPointer.memory where status == 0 {
                fillPixelBufferFromImage(image, pixelBuffer: pixelBuffer)
                appendSucceeded = pixelBufferAdaptor.appendPixelBuffer(pixelBuffer, withPresentationTime: presentationTime)
                pixelBufferPointer.destroy()
            } else {
                NSLog("Error: Failed to allocate pixel buffer from pool")
            }

            pixelBufferPointer.dealloc(1)
        }
    }

    return appendSucceeded
}

func fillPixelBufferFromImage(image: UIImage, pixelBuffer: CVPixelBufferRef) {
    CVPixelBufferLockBaseAddress(pixelBuffer, 0)

    let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer)
    let rgbColorSpace = CGColorSpaceCreateDeviceRGB()

    // Create CGBitmapContext
    let context = CGBitmapContextCreate(
        pixelData,
        Int(image.size.width),
        Int(image.size.height),
        8,
        CVPixelBufferGetBytesPerRow(pixelBuffer),
        rgbColorSpace,
        CGImageAlphaInfo.PremultipliedFirst.rawValue
    )

    // Draw image into context
    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage)

    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0)
}

func saveVideoToLibrary(videoURL: NSURL) {
    PHPhotoLibrary.requestAuthorization { status in
        // Return if unauthorized
        guard status == .Authorized else {
            print("Error saving video: unauthorized access")
            return
        }

        // If here, save video to library
        PHPhotoLibrary.sharedPhotoLibrary().performChanges({
            PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(videoURL)
        }) { success, error in
            if !success {
                print("Error saving video: \(error)")
            }
        }
    }
}

A: For those still doing the journey in 2020, and getting distortion in their movies because its not width 16px
change
CGContextRef context = CGBitmapContextCreate(pxdata,
                                             width, height,
                                             8, 4 * width,
                                             rgbColorSpace,
                                             kCGImageAlphaNoneSkipFirst);

to
CGContextRef context = CGBitmapContextCreate(pxdata,
                                             width, height,
                                             8, CVPixelBufferGetBytesPerRow(pxbuffer),
                                             rgbColorSpace,
                                             kCGImageAlphaNoneSkipFirst);

Credit to @bluedays Output from AVAssetWriter (UIImages written to video) distorted

A: Well this is a bit hard to be implemented in pure Objective-C....If you are developing for jailbroken devices , a good idea is to use the command-line tool ffmpeg from inside your app.
it's quite easy to create a movie from images with a command like:
ffmpeg -r 10 -b 1800 -i %03d.jpg test1800.mp4

Note that the images have to be named sequentially , and also be placed in the same directory.
For more information take a look at:
http://electron.mit.edu/~gsteele/ffmpeg/

redpajama_set_name: RedPajamaStackExchange


As a futurist, I spend much of of my time thinking about "what happens next?" In this article, I'll share an insider's view of the finance industry. Much has changed in the past 25 years, and it's been exciting to watch.
1) Rise in popularity of index investing. There is extreme price compression going on in commoditized asset management. It truly is a race to the bottom. Some index funds now carry annualized fees as low as 0.04%. This is beginning to translate into fee compression for traditional active managers.
This is also translating into so-called "economies of scale" - bigger companies are getting more competitive, in part, because they can charges lower fees.
Meanwhile, conventional mutual funds are bleeding assets, while the bulk of new inflows are going to a handful of Index providers, primarily those offering Exchanged Traded Funds (ETFs).
Source:FactSet, P&I and Simfund as of 03/31/2018.
The irony here, is that big fund companies such as Vanguard and Blackrock may be the ultimate beneficiaries from the rise of robo-advisors (which tend to rely heavily on index funds). The top ten asset managers now own roughly 30% of all the companies represented in the S&P 500 index.
2) Because of the dominance of indexing strategies, stock selection is going somewhat out of favor for the general public. Investment management is becoming more about understanding and tracking the exposures that your companies correlate to, and less about the companies themselves. Think about that.
For sophisticated investors, privately managed equity portfolios continue to offer tax efficiency, along with the ability to customize accounts according to individual preferences.
3) Automation disrupted the investment research world a while ago. I run into quite a few former analysts / portfolio managers that were outsourced to algorithms. A regional bank a few blocks away from the StratFI office almost entirely liquidated its staff of analysts back in the mid 2000's.
Just last January, the AI Powered Equity ETF (ticker: AIEQ) was introduced, using IBM's Watson to actively manage stock selection. This will be fascinating to watch.
A few years ago, we saw a boom in smart beta ETFs, which focus on various "factors" (value, momentum, quality, etc.) that appear to provide superior performance characteristics over time. As any expert would tell you, these factors come and go out of favor.
So, the new, new thing would be strategies that actively switch between those factors. Oppenheimer funds started its own Oppenheimer Russell Dynamic Multifactor ETF (OMFL) and Vanguard is following up with its own multifactor ETF (VFMF).
These strategies blend active management with algorithmic enhancement to traditional indexed strategies. How "meta" is that?
5) The headaches of regulatory oversight are contributing to a decline in the number of publicly-traded companies within the U.S. These figures peaked shortly before the adoption of Regulation FD (2000) and Sarbanes-Oxley (2002).
It is much more appealing to be a privately owned and funded company now, especially with an abundance of venture capital. Easy money, less regulation, what's not to like?
Many companies are waiting much longer before having their IPO, with initial public offerings now more of an exit strategy than a funding mechanism. The result is a narrower set of opportunities for public investors.
6) Blockchain technologies pose a competitive threat to traditional financial institutions. Blockchain/crypto-currencies already provide alternatives for funding, trading, and cash transfer. Financial intermediaries run the risk of becoming disintermediated.
Initial Coin Offerings (ICOs), those bizarre love children of crowdfunding and IPOs, have already raised more than $9B this year. While crypto-currencies boomed in a "Wild-West" environment, further adoption will necessitate some further regulatory oversight.
7) When the stock market (eventually) goes into bear mode - index funds are likely to get sold first. It is how flash-crashes happen. Many ETFs are not going to be as liquid as people think, periodically trading at steep discounts to net asset value. This will create a counter-trend opportunity for active managers.
8) The future of advice. You'll want to be sure that your financial advisor can keep up with the times.
The trend seems to be moving towards bigger money managers offering a less personalized experience. Some financial advisors are going into full "robo" mode, while others are more focused on "soft" services such as life coaching. At StratFI, we provide leading-edge investment advice with personal access.
Our offerings continue to evolve rapidly. Feel free to give us a call or send an email if you'd like to learn more.
Disclosure: Information contained herein is for educational purposes only and is not to be considered a recommendation to buy or sell any security or investment advice. The advisor may hold shares of OMFL and AIEQ within client accounts. Securities listed herein are for illustrative purposes only and are not to be considered a recommendation.


text:
What An Attractive Girl
If you are not triggered by these occasions than I would suggest you checking it out for your self. The Aviator will step in again, when she wants his assist the most and it's in this half the place she lastly finds the means to forgive herself. A attractive e-book that encompasses a lot, some could say an excessive quantity of, however I liked her journey from lows to highs, from an innocent naivesness to acknowledging her own energy, and to the belief that family is available in all dimensions and shapes.
Some had been together for just some months, others for a quantity of years. Actively decoding physique language can give you an edge in your communication abilities. It may also be used as a tool to attach with the individual you are talking to.
Current Critiques
Our brain instantly begins to seek for more info and inevitably prompts us to follow up with questions that may provide higher clarity to the scenario at hand. And in all reality, not saying one thing could be simply as essential as truly saying something. True stunning is rarely xhamester about seems, it's all about being a good individual. What makes you stunning is being kind, carefree and joyful. In conversations you are prepared to let go your insecurities. You are keen to share stories to help others out and never be worried by what they'll assume.
From the very first pages of this guide, I was hooked.
But I'd argue that there's extra to "Jump" than a white rock band on a soundstage with Dave kicking air.
She study the ropes and turns into successful whereas making associates.
Whether you're a giant time The Golden Girls fan, or just a casual viewer, you're probably familiar with Blanche's mid-century house situated at 6151 Richmond Street in Miami, Florida. As you may already know, that handle is bogus, as nicely as all of the rooms in the home the place the women have been filmed—it was just a set. However, the iconic one-story house flashed during The Golden Girls first season may be very much actual. And now, for the first time ever, it has been put up on the market. WHYY offers a voice to these not heard, a platform to share everyone's stories, a basis to empower early and lifelong learners and a trusted area for unbiased information.
But one way or the other, doggedly, true love teaches its lesson, which is that you could fall in love with an ideal, however you presumably can only be in love with a human being. "I came via the entire period and time when , 'Do you lose your femininity whenever you lift weight? '" mentioned Baxter in a tribute video created by filmmaker and pal Samuel Oldham.
"Small hips – small breasts. Big breasts – huge hips," she explains. By holding onto an unrealistic image of the dream woman they could by some means, sometime, be able to meet, the guys are denying themselves a good relationship with a real flesh-and blood lady proper here in their hometown. Given MTV priorities in 1984, one can dismiss Van Halen's "Jump" video as no-brainer programming.

redpajama_set_name: RedPajamaCommonCrawl


The 2014 Escape Titanium AWD is a great all season vehicle. It gets great fuel economy, handles better than most cars, and gives you a seating position higher than most traffic. The full moon roof and the automatic rear hatch make this as much fun as a convertible.
Lo sentimos 2014 Ford Escape, no hay avisos que se correspondan con lo buscado.
Prom. Calificación del concesionario: (16 evaluaciones) "After the salesman told us that the price was negotiable, They wouldn't budge at all on that price, AND they wanted to add on $5,000 worth of dealer fees, and taxes and motor vehicle. $1500 For a warranty that I didn't ask for and $1000 for shop fees for cleaning the car and giving it a tuneup, and $600 in non-descriptive fees. Then DMV and taxes. Will never go there again. "
Prom. Calificación del concesionario: (7 evaluaciones) "Great folks. Courteous and friendly. Not the best price even though they had one of the top 2 vehicles I wanted. In S. Florida where price is not a consideration for the locals. "
Prom. Calificación del concesionario: (7 evaluaciones) "Pretty Awesome People"
Prom. Calificación del concesionario: (38 evaluaciones) "They don't "
Prom. Calificación del concesionario: (59 evaluaciones) "They were awesome I give them an A+ Greg jr is a great salesman."
Prom. Calificación del concesionario: (2 evaluaciones) "very helpful and great guys."
Prom. Calificación del concesionario: (90 evaluaciones) "I didn't buy the car but was very helpful "
Prom. Calificación del concesionario: (36 evaluaciones) "Vehicle pictured was not even close to the vehicle being sold."
Prom. Calificación del concesionario: (15 evaluaciones) "They were very helpful"
Prom. Calificación del concesionario: (11 evaluaciones) "Quick response "
Prom. Calificación del concesionario: (15 evaluaciones) "Vehicle I was interested in was no longer there but they showed me other similar vehicles"
Prom. Calificación del concesionario: (20 evaluaciones) "Very knowledgeable about vehicle"


text:
Sr. Product Designers
Zeni is on a mission to build the world's most advanced CFO-As-A-Service platform, built from the ground up using AI and ML. Built by the founders of Mezi, an AI-powered Travel-As-A-Service platform, you'll be working with a team that has spent the last five years building and scaling one of the most successful human-assisted AI platforms.
Zeni is on a mission to build the world's most advancedCFO-As-A-Service platform, build from the ground up using AI and ML. You'll be working with a team that has spent the last six years building and scaling one of the most successful human-assisted AI platforms.
We are looking for Sr Product Designers who are tremendously passionate about forward-looking and futuristic technology solutions and are able to tie them back into the world of finances. You love to go the extra mile to make sure your work is done with the highest excellence for every Zeni customer.
Our mission is to make financial management a "Zen" experience for our customers. You will work closely with founders of the most disruptive tech startups in the industry. The Zeni team goes the extra mile to drive the customer experience through technology and financial acumen.
Design an entirely new branch of product functionality — from rough concept to pixel-perfect designs
Be opinionated and leverage a direct line to our customers (external and internal) to get insights. Explore solutions, create prototypes, and dive into user feedback/data to identify points of friction and opportunities for improvement for every initiative.
Advocate for our users by continuously iterating on and evolving our core products and experiences. Identify areas of improvement and deliver value to customers every day.
Collaborate with the rest of the design team to evolve our long-term product vision, design systems, brand guidelines, and internal design collaboration process.
Turn incomplete, conflicting, or ambiguous inputs into solid action plans
Brainstorm with Designers, and Engineers to conceptualize and build new features for products
Participate in day-to-day team rituals like design crit, story creation, weekly stand-ups, etc
Minimum 4 years of tech/startup or digital product agency experience
Mastery of Product Design software (Sketch, Figma, Adobe XD)
A portfolio that demonstrates UX and visual skills in digital products
Demonstrated experience with end-to-end (hybrid UX and UI) product design
Experience in building and shipping applications or software
Experience owning products from start to finish, working with developers and PMs
Ability to research, ideate, and define the vision for projects within their unit
Extraordinary visual design skills
Strong understanding of UX principles and workflows
Have strong attention to detail - small details add up to define the product's feel and usability
Strong background in visual/interaction design, UX/UI, branding & identity, and typography
Mastery of low and high-fidelity prototyping tools and methods, and their use in UX Research
Be comfortable with ambiguity - product ideas are often vague/abstract to start off, and need to be carefully solidified
Excellent communication and collaboration skills
Culture and Perks
We approach work with a calm focus and a sense of humor, while keeping sane working hours. At Zeni, we also have a culture where ideas come from the bottom up! Ownership, trust and support will be afforded to you in a setup that will allow you to be yourself and add value like never before. You'll receive a competitive salary package and stock, plus perks, with flexible and remote working hours. Social responsibility is something we believe in and regularly volunteer with our community partners with the full support of the company.
Medical, dental & vision insurance coverage
Unlimited PTO
Education/CPE reimbursement
WFH stipend to support your home office needs
About Zeni
Zeni provides startups with a fast, reliable, full-service AI-powered bookkeeping and accounting solution so they can optimize their business daily. With Zeni, startups have access to real-time financial insights via their Zeni Dashboard, and a team of finance experts to manage their every finance function for a flat monthly fee — daily bookkeeping, yearly taxes, bill pay and invoicing, financial projections, budgeting, payroll administration, and more.
Zeni has a growing and talented team across the U.S. and India. To-date, our business growth is 100% attributed to organic channels, and we're investing in our growth with strategic hires across marketing, sales, and customer success in 2022 and beyond. Zeni is a Series B SaaS fintech backed by leading tech investors, founded in 2019 by twin brothers and serial entrepreneurs Swapnil Shinde and Snehal Shinde.
Sounds like the role for you? Hit 'Apply Now' and let's get started, or email careers@zeni.ai!
Looking for other opportunities?
Check out all the open job positions in our careers section.
All job Positions