text:
Chapters XVIII & XIX
How Hemadpant was Accepted and Blessed
Stories of Mr. Sathe and Mrs. Deshmukh - Encouraging Good Thoughts to Fruition-Variety in Upadesh-Teachings Readings Slander, and Remuneration for Labour.
In the last two Chapters, Hemadpant described how a rich gentleman, aspiring for quick Brahma-Jnana, was treated by Baba, and now in these two Chapters, he describes how Hemadpant, himself, was accepted and blessed by Baba, how Baba encouraged good thoughts and fructified them; and gives His teachings regarding Self-improvement, slander and remuneration for labour.
It is a well-known fact, that the Sadguru looks first to the qualifications of his disciples; and then gives them suitable instructions, without unsettling their minds in the least, and leads them on towards the goal of self-realization. In this respect, some say that what the Sadguru teaches or instructs, should not be divulged to others. They think that their instructions, become useless, if they are published. This view is not correct. The Sadguru is like a monsoon cloud. He pours down profusely, i.e., scatters widely his nectar-like teachings. These, we should enjoy and assimilate to our heart's content; and then serve others with them, without any reserve. This rule should apply, not only to what he teaches in our waking state, but to the visions he gives us in our dreams. To quote an instance: Budhakowshik Rishi published his celebrated Ram-raksha Stotra, which he had seen in his dream.
Like a loving mother forcing bitter medicines down the throats of her children for the sake of their health, Sai Baba imparted spiritual instructions to His devotees. His method was not veiled or secret, but quite open. The devotees, who followed His instructions, got their object. Sadgurus like Sai Baba open our (eyes of the) intellect and show us the divine beauties of the Self, and fulfill our tender longings of devotion. When this is done, our desire for sense-objects vanishes, twin fruits of Viveka (discrimination) and Vairagya (dispassion or non-attachment) come to our heads; and knowledge sprouts up even in the sleep. All this we get, when we come in contact with Saints (Sadguru), serve them and secure their love. The Lord, who fulfills the desires of His devotees, comes to our aid, removes our troubles and sufferings, and makes us happy. This progress or development is entirely due to the help of the Sadguru, who is regarded as the Lord Himself. Therefore, we should always be after the Sadguru, hear His stories, fall at His Feet and serve Him. Now we come to our main story.
Mr. Sathe
There was a gentleman named Mr. Sathe, who had attained some publicity many year ago, during Crowford Regime, which was put down by Lord Reay, the Governor of Bombay. He suffered serve losses in trade. Other adverse circumstances gave him much trouble, and made him sad and dejected. Being restless, he thought of leaving home; and going out to a distant place. Man does not generally think of God, but when difficulties and calamities overtake him, he turns to Him and prays for relief. If his evil actions have come to an end, God arranges his meeting with a Saint, who gives him proper directions regarding his welfare. Mr. Sathe had similar experience. His friends advised him to go to Shirdi, where so may people were flocking to get Sai Baba's darshana, for getting peace of mind and the satisfaction of their wants. He liked the idea, and at once came to Shirdi in 1917 A.D. Seeing Baba's Form, which was like Eternal Brahma, Self-luminous, Spotless and Pure, his mind lost its restlessness and became calm and composed. He thought, that it was the accumulation of merits in his former births, that brought him to the Holy Feet of Baba. He was a man of strong will. He at once started to make a parayana (study) of Guru-charitra. When the reading was finished in the saptaha (seven days), Baba gave him a vision that night. It was to this effect: Baba with Guru-charitra in His hand was explaining its contents to Mr. Sathe, who was sitting in front and listening carefully. When he woke up, he remembered the dream and felt very happy. He thought that it was extremely kind of Baba, Who awakens souls like his that are snoring in ignorance, and makes them taste the nectar of Guru-charitra. Next day, he informed Kakasaheb Dixit of this vision, and requested him to consult Sai Baba regarding its meaning or significance-whether one saptah (week's) reading was sufficient or whether he should begin again. Kakasaheb Dixit, when got a suitable opportunity, asked Baba - "Deva (Oh God), what did you suggest to Mr. Sathe by this vision? Whether he should stop or continue the saptah? He is a simple devotee, his desire should be fulfilled and the vision explained to him, and he should be blessed." Then Baba replied - 'He should make one more saptah of the book; if the work be studied carefully, the devotee will become pure and will be benefited, the Lord will be pleased and will rescue him from the bondage of the mundane existence."
At this time, Hemadpant was present there. He was shampooing Baba's Legs. When he heard Baba's words, he thought in his mind as follows - "What! Mr. Sathe read for a week only and got a reward; and I am reading it for forty years with no result! His seven days' stay here becomes fruitful while my seven years' stay (1910 to m1917) goes for nothing. Like a Chatak bird I am ever waiting for the Merciful Cloud (Baba) to pour its nectar on me; and bless me with His instructions." No sooner did this thought cross his mind, Baba knew it then and there. It was the experience of the Bhaktas that Baba read and understood all their thoughts, and that He suppressed the evil thoughts and encouraged the good ones. Reading Hemadpant's mind Baba at once asked him to get up, go to Shama (Madhavrao Deshpande), get from him Rs. 15/- as Dakshina, sit and chitchat with him for a while and then return. Mercy dawned in Baba's mind, and so he issued this order. And who could disobey Baba's order?
Hemadpant immediately left the Masjid and came to Shama's house. He had just bathed, and was wearing a dhotar. He came out and asked Hemadpant - "How is it that you are here now? It seems that you have come from the Masjid. Why do you look restless and dejected? Why are you alone? Please sit and rest, while I shall just do my worship and return: in the meanwhile please take pan-vida (leaves and batal nuts etc.) let us then have a pleasant chat." After saying his, he went inside and Hemadpant sat alone in the front varandah. He saw in the window a welknown Marathi book named 'Nath-Bhagwat.' This is a commentary by the Saint Eknath, on the eleventh Skandha (chapter) of the bigger Sanskrit work, the Bhagwat. At the suggestion or recommendation of Sai Baba, Messrs. Bapusaheb Jog and Kakasaheb Dixit read daily in Shirdi, Bhagwad-Gita with its Marathi commentary named Bhawartha-Deepika or Jnaneshwari (A dilogue between Krishna and His friend devotee Arjuna) and Nath Bhagwat (A dilogue between Krishna and His servant devotee Uddhava) and also Eknath's other big work, viz., Bhawartha Ramayana. When devotees came to Baba and asked Him certain questions, He sometimes answered them in part, and asked them to go and listen to the readings of the above-mentioned works, which are the main treatises of Bhagwat Dharma. When the devotes went and listened, they got full and satisfactory replies to their questions. Hemadpant also used to read daily some portions of the book Nath-Bhagwat.
That day, he did not complete the daily portion of his reading, but had left it unfinished in order to accompany certain devotees, who were going to the Masjid. When he took up the book from Shama's window and casually opened, it, he found, to his surprise, that the unfinished portion turned up. He thought that Baba sent him very kindly to Shama's house for enabling him to complete his daily reading. So he went through the unfinished portion and completed it. As soon as this was over, Shama, after doing his worship came out, and the following conversation took place between them.
Hemadpant :- I have come with a message from Baba. He has asked me to return with Rs. 15/- as Dakshina from you, also to sit with you for a while and have a pleasant chitchat and then return to the Masjid with you.
Shama (with surprise):- I have no money to give. Take my 15 Namaskaras (bows) in lieu of rupees as Dakshina, to Baba.
Hemadpant:- Alright, your Namaskaras are accepted. Now let us have some chitchat. tell me some stories and Leelas of Baba, which will destroy our sins.
Shama:- Then sit here for a while. Wonderful is the sport (Leela) of this God (Baba). You know it already. I am a village rustic, while you are an enlightened citizen. You have seen some more leelas, since your coming over here. How should I describe them before you? Well, take these leaves, betel nut and chunam and eat the pan-vida; while I go in, dress myself and come out.
In a few minutes, Shama come out, and sat talking with Hemadpant. He said - "The Leela of this God (Baba) is inscrutable; there is no end to His Leelas. Who can see them? He plays or sports with His Leelas, still He is outside of (unaffected by) them. What do we rustics know? Why does not Baba Himself tell stories? What does He send learned men like you to fools like me? His ways are inconceivable. I can only say, that they are not human." With this preface Shama added, - "I now remember a story, which I shall relate to you. I know it personally. As a devotee is resolute and determined, so is Baba's immediate response. Sometimes Baba puts the devotees to severe test; and then gives them 'Upadesh' (instructions)."
As soon as Hemadpant heard the word 'Upadesh', as if a flash of lightning crossed, through his mind. He at once remembered the story of Mr. Sathe's Guru-charitra reading and thought that Baba might have sent him to Shama, in order to give peace to his restless mind. However, he curbed this feeling, and began to listen to Shama's stories. They all showed how kind and affectionate Baba was to His devotees. Hemadpant began to feel a sort of joy on hearing all these. Then Shama began to tell the following story.
Mrs. Radhabai Deshmukh
There was an old woman by name Radhabai, She was the mother of one Khashaba Deshmukh. Hearing Baba's fame, she came to Shirdi with the people of Sangamner. She took Baba's darshana, and was much satisfied. She loved Baba intimately and resolved in her mind, that She should accept Baba as her Guru, and take some upadesh from Him. She determined to fast herself unto death, so long as Baba did not accept her, and give her any Upadesh or Mantra. She stayed in her lodging and stopped taking in any food or water for three days. I was frightened by this ordeal of the old woman, and interceded with Baba on her behalf. I said, "Deva, what is this You have started? You drag so many persons here. You know that old lady. She is very obstinate and depends on You entirely, She has resolved to fast unto death, if You don't accept and instruct her. If any thing worse happens, people will blame You, and say that Baba did not instruct her, and consequently she met her death. So take some mercy on her, bless her and instruct her." On seeing her determination, Baba sent for her, changed the turn of her mind by addressing her as follows:-
"Oh mother*, why are you subject yourself to unnecessary tortures and approaching death? You are really My mother and I am your child. Take pity on Me and hear Me through. I tell you My own story, which if you listen carefully, will do you good. I had a Guru. He was a great Saint and most merciful. I served him long, very long; still he would not blow any Mantra into My ears. I had keen desire, never to leave him but to stay with and serve him; and at all costs receive some instructions from him. But he had his own way. He first got my head shaved and asked Me two pice as Dakshina. I gave the same at once. If you say, that as My Guru was perfect, why should he ask for money and how should he be called desireless? I reply plainly that he never cared for coins. What had he to do with them? His two pice were (1) Firm Faith and (2) Patience or perseverance. I gave these two pice or things to him, and he was pleased.
"I resorted to My Guru for 12 years. He brought Me up. There was no dearth of food and clothing. He was full of love or say, he was love incarnate. How can I describe it? He loved Me most. Rare is a Guru like him. When I looked at him, he seemed as if he was in deep meditation, and then we both were filled with Bliss. Night and day, I gazed at him with no thought of hunger and thirst. Without him, I felt restless. I had no other subject to meditate, nor any other thing than My Guru to attend. He was My sole refuge. My mind was always fixed on him. This is one pice of Dakshina, Saburi (Patience or perseverance) is the other pice. I waited patiently and very long on My Guru and served him. This Saburi will ferry you across the sea of this mundane existence. Saburi is manliness in man, it removes all sins and affliction,s gets rid of calamities in various ways, and casts aside all fear, and ultimately gives you success. Saburi is the mine of virtues, consort of good thought. Nishtha (Faith) and Saburi (Patience) are like twin sisters, loving each other very intimately."
"My Guru never expected any other thing from Me. He never neglected Me, but protected Me at all times. I lived with him, and was sometimes away from him; still I never felt the want or absence of his love. He always protected Me by his glance, just as the tortoise feeds her young ones, whether they are near her or away from her on the other side of the river bank, by her loving looks. Oh mother, My Guru never taught Me any Mantra, then how shall I blow any Mantra in your ears? Just remember that Guru's tortoise-like loving glance gives us happiness. Do not try to get Mantra or Upadesh from anybody. Make Me the sole object of your thoughts and actions; and you will, no doubt, attain Paramartha (the spiritual goal of life). Look at Me whole-heartedly, and I in turn look at you similarly. Sitting in this Masjid, I speak the truth, nothing but the truth. No Sadhanas, nor proficiency in the six Shastras, are necessary. Have faith and confidence in your Guru. Believe fully, that Guru is the sole Actor or Doer. Blessed is he who knows the greatness of his Guru and thinks him to be Hari, Hara and Brahma (Trimurti) Incarnate".
Instructed in this way, the old lady was convinced; she bowed to Baba and gave up her fast.
Hearing this story carefully and attentively, and marking its significance and appropriateness, Hemadpant was most agreeably surprised. On seeing this wonderful Leela of Baba, he was moved from top to toe, he was overflowing with joy, his throat was choked, and he was not able to utter a single word. Shama, on seeing him in this condition asked him, - "What is the matter with you, why are you silent? How many innumerable Leelas of Baba shall I describe!"
Just at this time the bell in the Masjid began to ring, proclaiming that the noon-worship and Arti ceremony had begun. Therefore, Shama and Hemadpant hurried to the Masjid. Bapusaheb Jog had just started the worship. Women were up in the Masjid, and men were standing below in the open courtyard; and they were all loudly singing the Arti in chorus to the accompaniment of drums. Shama went up, pulling Hemadpant with him. He sat to the right and Hemadpant in front of Baba. On seeing them, Baba asked Hemadpant to give the Dakshina brought from Shama. He replied that Shama gave Namaskaras in lieu of Rupees and that he was there in person. Baba said, "Alright, now let Me know whether you both had a chitchat, and if so, tell Me all that you talked about." Not minding the sounds of the bell, the drum and the chorus songs, Hemadpant was eager to tell what they had talked and started to narrate it. Baba was also anxious to hear, and so He left the bolster and leaned forward. Hemadpant said all that they talked about was very pleasant, and that specially the story of the old lady was most wonderful and that on hearing it, he thought that His Leela was inexplicable, and under the guise of that story, He really blessed him. Baba then said - "Wonderful is the story. How were you blessed? I would like to know everything in detail from you, so tell Me all about it." Then Hemadpant related in full the story which he had heard a little while before, and which had made a lasting impression on his mind. Hearing this Baba was much pleased and asked him - "Did the story strike you and did you catch its significance?" He replied - "Yes, Baba the restlessness of my mind has vanished and I have got true peace and rest, and come to know the true path."
Then Baba spoke as follows:- "My method is quite unique. Remember well, this one story, and it will be very useful. To get the knowledge (realization) of the Self, Dhyana (meditation) is necessary. If you practice it continuously, the Vrittis (thoughts) will be pacified. Being quite desireless, you should meditate on the Lord, Who is in all the creatures, and when the mind is concentrated, the goal will be achieved. Meditate always on My formless nature, which is knowledge incarnate, consciousness and Bliss. If you cannot do this, meditate on My Form from top to toe, as you see here night and day. As you go on doing this, your Vrittis will be one-pointed and the distinction between the Dhyata (meditator), Dhyana (act of meditation), Dhyeya (this meditated upon) will be lost; and the meditator will be one with the Consciousness and be merged in the Brahman. The (mother) tortoise is on the bank of the river, and her young ones are on the other side. She gives neither milk, nor warmth to them. Her mere glance gives them nutrition. The young ones do nothing, but remember (meditate upon) their mother. The tortoise glance is, to the young ones, a down-pour of nectar, the only source of sustenance and happiness. Similar is the relation, between the Guru and disciples."
When Baba uttered these last words, the chorus of the Arti songs stopped and all cried out loudly in one voice: "Victory be to our Sadguru Sai Maharaj, Who is Existence, Knowledge and Bliss."* Dear readers, let us imagine, that we are at this time, standing amongst the crowd in the Masjid; and let us join them in this Jayajayakar.
After the Arti ceremony was over, Prasad was distributed. Bapusaheb Jog advanced as usual, and after saluting Baba, gave into His hand a handful of sugar-candy. Baba pushed all this quantity into the hands of Hemadpant and said to him, "If you take this story to heart and remember it well, your state will be sweet as the sugar-candy, all your desires will be fulfilled and you will be happy." Hemadpant bowed before Baba and implored, "Do favour me like this, bless and protect me always." Baba replied - "Hear this story, meditate on it and assimilate its spirit. Then you will always remember and meditate on the Lord, Who will manifest Himself to you."
Dear readers! Hemadpant got Prasad of sugar-candy then; and we now get the Prasad of sugar-candy or nectar of this story. Let us drink it to out heart's content, meditate on it, and assimilate it, and be strong and happy by Baba's grace. Amen!
Towards the end of the 19th Chapter Hemapter Hemadpant had dealt with some other matters which are give below.
Baba's Advice Regarding our Behaviour
The following words of Baba are general and invaluable. If they are kept in mind and acted upon, they will always do you good. "Unless there is some relationship or connection, nobody goes anywhere. If any men or creatures come to you, do not discourteously drive them away, but receive them well and treat them, with due respect. Shri Hari (God) will be certainly pleased, if you give water to the thirsty, bread to the hungry, clothes to the naked, and your verandah to strangers for sitting and resting. If anybody wants any money from you, and you are not inclined to give, do not give, but do not bark at him, like a dog. Let any body speak hundreds of things against you, do not resent by giving any bitter reply. If you always tolerate such things, you will certainly be happy. Let the world go topsy-turvy, you remain where you are. Standing or staying in your own place, look on calmly at the show of all things passing before you. Demolish the wall of difference that separates you from Me; and then the road for our meeting will be clear and open. The sense of differentiation, as I and thou, is the barrier that keeps away the disciple from his Master, and unless that is destroyed the state of union or atonement is not possible, "Allah Malik" i.e., God is the sole Proprietor, nobody else is our Protector. His method of work is extra-ordinary, invaluable, and inscrutable. His will be done and He will show us the way, and satisfy our heart's desires. It is on account of Rinaubandh (former relationship) that we have come together, let us love and serve each other and be happy. He, who attain the supreme goal of life, is immortal and happy; all others merely exist, i.e., live so long as they breathe".
Encouraging Good Thoughts of Fruition
It is interesting to note how Sai Baba encouraged good thoughts. You have to surrender yourself completely to Him with love and devotion, and then you will see how, He helps you, off and on, in so many things. Some Saint has said, that when you get a good thought, immediately after awakening from sleep, and if you develop the same afterwards during the day, your intellect will be unfolded and your mind will attain calmness. Hemadpant wanted to try this. On one Wednesday night before going to bed, he thought - "Tomorrow is Thursday - an auspicious day and the place, viz., Shirdi, is so holy; so let me pass the whole day in remembering and celebrating the Rama-nam", and then he slept. Next morning when he got, up, he remembered without any effort the name of Rama and was much pleased. He then, after finishing his morning duties, went to see Baba with flowers. When he left Dixit's Wada, and was just passing Booty's Wada (present Samadhi-mandir) he heard a beautiful song that was being sung nicely by one Aurangabadkar, in the Masjid before Baba. The song was "Guru-kripanjan payo mere bhai" etc. by Eknath, in which he says that he got collyrium in the form of Guru's grace which opened his vision and made him see Rama, in and out, in sleep, dream, and waking state and everywhere. There were so many songs; but why was this song particularly chosen by Aurangabadkar, a devotee of Baba? Is this not a curious coincidence arranged by Baba to amplify the determination of Hemadpant to sing unceasingly Rama-nama, during the day?
All Saints agree on and lay stress upon the efficacy of uttering Rama's (God's) name, in fulfilling the ambitions of the Bhaktas and in protecting and saving them from all calamities.
Variety in Upadesh-Slanderer Condemned
Sai Baba required no special place, nor any special time for giving instructions. Whenever any occasion demanded, He gave them freely. Once it so happened that a Bhakta of Baba, reviled another behind his back, before other people. On leaving aside merits, he dwelt on the faults of his brother, and spoke so sarcastically, that the hearers were disgusted. Generally, we see that people have a tendency to scandalize others unnecessarily; and this brings on hatred and ill-will. Saints see scandal, in another light. They say that there are various ways of cleansing or removing dirt, viz. by means of earth, water and soap etc., but a scandal-monger has got a way of his own. He removes the dirt (faults) of others by his tongue; so in a way he obliges the person whom he reviles and for this he is to be thanked. Sai Baba had his own method of correcting the scandal monger. He met him at noon near the Lendi, Baba pointed out to him a pig that was eating filth near the fence and said to him - "Behold how, with what relish it is gorging dung. Your conduct is similar. You go on reviling your own brethren to your heart's content. After performing many deeds of merit, you are born as a man, and if you act like this, will Shirdi help you in any way?" Needless to say, that the Bhakta took the lesson to his heart, and went away.
In this way Baba went on giving instructions whenever necessary. If these are born in our minds and acted upon, the spiritual goal (realization) is not far off. There is a proverb which says - "If there be my Hari (Lord), He will feed me on my cot." This proverb is only true in respect of food and clothing, but if anyone trusting in this, sits quiet and does nothing in spiritual matters, he will be ruined. One has to exert himself to his utmost for attaining self-realization. The more he endeavours, the better for him.
Baba said that He was omnipresent, occupying land, air, country, world, light and heaven, and that He was not localised. To remove the misunderstanding of those, who thought that Baba was only His body-three cubits and a half in length, He incarnated Himself in this form and if any devotee meditated on Him, day and night, with complete self-surrender, he experienced complete union (without any difference) with Him like sweetness and sugar, waves and sea, eye and its luster. He, who wants to get rid of the cycle of births and deaths, should lead a righteous life, with his mind calm and composed. He should always engage himself in good actions, should do his duties and surrender himself, heart and soul, to Him. He need not, then, be afraid of anything. He, who trusts Him entirely, hears and expounds His Leelas, and does not think of anything else, is sure to attain self-realization. Baba asked many to remember His name and to surrender to Him, but to those, who wanted to know who they were ('Who am I' enquiry), He advised Shravanam (study) and Mananam (meditation). To some, He advised remembering God's name, to others hearing His Leelas, to some worship of His Feet, to others reading and studying Adhyatma Ramayan, Jnaneshwari and other sacred scriptures, Some, He made them sit near His Feet, some He sent to Khandoba's temple, and some He advised the repetition of the thousands names of Vishnu; and some the study of Chhandogya Upanishad and Gita. There was neither any limit, nor any restriction to His instructions. To some, He gave them in person. To others, by visions in dreams. To one addicted to drink, He appeared in his dream, sat on his chest, pressed it and left him, after he gave a promise not to touch liquor anymore. To some, He explained some Mantras like `Gurur Brahma' in dreams. To some devotee, who was practising Hath-Yoga, He sent word that he should leave off Hath-Yoga practices, sit quiet and wait (Saburi). It is impossible to describe all His ways and methods. In ordinary wordly dealings, He set examples by His actions, one of which is given below.
Remuneration for Labour
One day at noon, Baba came near Radha-Krishna-Mai's house and said - "Bring Me a ladder." Some men brought it and set it against a house as directed by Baba. He climbed up on the roof of Vaman Gondkar's house, passed the roof of Radha-Krishna-Mai's house and then got down from the other corner. What object Baba had, none could know. Radha-Krishna-Mai was, at that time, shivering with Malaria. It may be to drive off that fever, that He may have gone there. Immediately after getting down, Baba paid Rupees two to the persons who brought the ladder. Somebody made bold and asked Baba, why he paid so much for this. He replied that nobody should take the labour of others, in vain. The worker should be paid, his dues promptly and liberally. If the principle taught by Baba be followed, i.e., if the remuneration for labour be paid promptly and satisfactorily, the labourers will turn out better work and both the labourers and their employers will be profited, and there will be no room for lock-outs and strikes, no ill feeling between Labour and Capital.


Trade volume rates available on request.
Intumescent paint to help make wood fire resistant. Fire resistant paint gives hard, durable finishes suitable for timber beams, panelling, boarding, doors, floors and furniture etc. Available in clear varnishes or a range of colours. Call us on 01753 684084 or email info@tools-paint.com for advice on the right product and paint system for the job in hand.


"Have you ever been faced with the both fun and daunting task to show someone around Amsterdam?" Well, yes! "I know this Great Little Place" created (together with design studio in60seconds and illustrator Lienke Raben) the solution, an original map op Amsterdam. A treasure map containing all of these hidden gems on which even a season Amsterdam local can discover unknown places. To celebrate the "Great Place of Amsterdam map" you can win the foldable map! Check Hello Frankie Instagram for more information about this amazing give away!


This new gTLD is dedicated to any kind of report-related websites.
There is no special process needed to register a .REPORT domain name, no special action is needed on your end.
.REPORT domain name Registration works on a first come, first served basis.
The transfer of a .REPORT domain to or from NETIM follows the "Inter registrar transfer policy" established by ICANN. It applies to every generic domain names and every registrars.


rush, yes, zappa, king crimson, coletrane, mahler, bush, mingus, bach, big star, richard thompson, captain beefheart, wagner, brand x, handsome family, philip glass, tull, gabriel, beatles, stravinsky, gentle giant, johnny dowd, marshall crenshaw, ornette coleman, grandpa jones . . .
warwick thumb bass, warwick pro tube IV amp, fender stratocaster, line6 pod, casio keyboard, tascam digital 8-track, alesis drum machine, rickenbacker 4003 bass.


text:
Abelard je mužské křestní jméno francouzského původu. Toto jméno pochází buď z provensálského slova abelha, což znamená "včelař", nebo je odvozeno od německého pojmu Abalhard s významem "vznešená moc, síla".

Podle maďarského kalendáře má svátek 21. dubna.

Domácké podoby
	Ábelek, Abe, Lardek

Abelard v jiných jazycích
 Slovensky, německy, anglicky: Abelard
 Španělsky: Abelardo
 Maďarsky: Abelárd

Známí nositelé jména
 Pierre Abélard – francouzský raně scholastický filozof a teolog

Externí odkazy

Mužská jména

redpajama_set_name: RedPajamaWikipedia


text:
campaigning for MMP in auckland
the downside to being a student again is that you get homework. i'm terrible at homework. i leave it til the last minute, but am totally stressed out by the fact that i haven't managed to get it done. i find it extremely difficult to motivate myself to do homework, no matter how much i might be enjoying the topic i'm studying.
and it doesn't help that other commitments keep me busy. yesterday i spent the day at the auckland international cultural festival, campaigning for MMP and here's the proof:
the weather wasn't wonderful, but it was a great way to catch up with a fair few people i knew, including the wonderful ruth, julie & her very cute & cuddly baby (who seemed to have a fascination with my bottom lip for some unknown reason), louisa wall, the peeps from the human rights commission & the migrant action trust, and sundry others.
the support for MMP seems to be quite strong, though you would expect that from the sort of people who attend this kind of event. there were a lot of people keen to get information on the campaign and please do visit the website if you want to get regular email updates or help out with the campaign.
i've had some posts up at the hand mirror over the last week: one on experiences at a hospital A&E, another on the wisdon of making a hero of someone who fought a bully, another on parental bullying, one on victim-blaming, and finally one tonight on the troublesome mr latta.
if only i could be as consistent at writing up my homework.
the indigo festival is on in hamilton, with lots of great events. there was the parade on saturday, culminating in performances in garden place. last night was the first of 3 films to be screened this week. it's called amreeka, and is a lovely story about a palestinian family that moves to america. the storyline is somewhat similar to my name is khan, but it doesn't have that bollywood melodrama attached. there will be a fashion parade later this week, and day-long fair at the hamilton gardens on sunday.
i also attended a meeting about the diversity forum which is to be held in hamilton this year. but more on that at a later date. it's been wonderful to have these positive aspects of diversity highlighted and celebrated, to see all this happening in our city, and to see so many people working hard to build a society where everyone belongs and can contribute.
so with all these positive feelings buzzing in my head, it was a real kick in the guts to come home and read this letter to the editor in the waikato times:
Young women beware
A recent TV newsclip of Sonny Bill Williams being mobbed by starry-eyed young women after a rugby match, intrigued me. I wonder if these same young women realise the man they idolise has recently chosen to follow (and presumably emulate) Mohammed.
Mohammad taught that woman are an affliction, although he himself had 14 wives, the youngest age six. He taught that men could change wives at will, provided they had no more than four at any one time, including temporary ones.
He claimed women were created as toys for men, and thus allowed for multiple sex slaves for his followers and himself, complete with female genital mutilation. Mohammed taught that women were deficient in intelligence and thus must not go to school. Newspapers recently reported that 100 schools in Pakistan were blown up and any surviving students flogged.
Muhammad taught that this intelligence deficiency must result in the testimony of one man equalling that of two women in court, and that for a woman to prove rape, she must provide four male witnesses, or she is lying.
Young women beware.
Fred Barret
i'm not going to spend any time here responding to this stuff. i just want to say how it makes me feel, but it's so hard to put into words. the first reaction is a that sick feeling you get in the pit of your stomach. then the feeling of helplessness and powerlessness in the face of such hate. this man sits there and spews out this vitriol without any concern for the muslim women who have to read it - which shows that he really isn't interested in women's dignity at all.
i could write a response, but know there will be plenty more letters than i can respond to if i bother to take that step. i could write a complaint, but not only will that lead nowhere, it will buy into the narrative of muslims being over-sensitive types who can't take criticism. but mostly, i just don't have the energy or capacity to deal with this. i feel like all the activities of the indigo festival, the diversity forum and all the other things happening around the country make so little difference.
i want to fight back, but my arms feel to heavy, as if i can't lift them. because it's not like this is the only thing that's happening. there was a similar muslim-hating letter last month, as well as a pretty nasty opinion piece by one michael cox against immigration - very nicely coded to target certain groups of immigrants by race and religion. it's the constant nastiness that is so wearying.
the only thing that gives me hope is that fred barrett is an old guy who hasn't had much interaction with muslims. perhaps he's part of a generation that's dying out, one that my children will no longer have to deal with. that maybe all this work people are doing to bring communities together will bear fruit over the longer term, and one day the fred barrett's of this world will be laughed out of the room. maybe.
why i'll be avoiding the news for a bit
i can not believe that even radio nz is sounding like the women's weekly magazine today. really? we need breathless reports of what prince william is doing, every hour? now he's visited this place, now he's said that. surely i'm not the only one who totally doesn't care? more than that, what prince williams does IS NOT NEWS. it's celebrity gossip for the entertainment section, which radio nz doesn't have.
i expect this kind of stupidity from tv news, which is why i don't watch it any more. but i would have thought that any kind of reputable media outfit would give a brief report, then move on to the important stuff. like fires in the nuclear reator thingies in japan. like all the people who are homeless. like what's the latest situation in libya, and how the people in the eastern suburbs of christchurch are getting on.
i wonder if our bonny prince went to the poorer parts of the city? i haven't been listening to or watching the coverage, but i'm willing to bet there were no opportunities for the poorer of his grandmother's subject to air their grievances or to give an eye-opening account of what life is really like. the only session which wasn't to be totally managed was the meeting of the families of the pike river miners who had died in the coalmine. but of course, media weren't allowed in.
this whole trip is a combination of a PR exercise for the monarchy and a PR exercise for politicians. somehow the latter doesn't rankle as much as the former. that the monarchy gets so much free advertisement, in order to keep that institution going for as long as possible when there is no reason for it to exist at all, well yes, that makes me really angry. and it angers me when our state-funded broadcaster provides this kind of advertising, again for no good reason at all. if people are interested in that sort of thing, they should go to the entertainment media.
on top of that, there is japan's emperor, called out to make a public statement in the midst of a potentially large disaster. i don't want to be insensitive to the feelings of anyone of japanese heritage, as i understand the culture around that institution is quite different to the british monarchy. let me just say that it seems many of the people there weren't reassured by his statement, so his status didn't appear to be of much help.
i'll go back to a point i've made before: i just can not understand how these royal families convince people to accept their status and position. though the in-your-face covering-all-forms-of media unpaid-for advertising campaign goes a long way to explaining it. ergo, if i want my campaign to become queen of nz to gain momentum, i first need significant amounts of capital to pay for a kick-a** PR campaign. unfortunately, i also believe that the state should be paying for said campaign, just like it has for our bonny prince. so a bit of a chicken-and-egg situation there.
while i think about how to resolve this conundrum, i shall continue to avoid the news for the next couple of days. there's not much option really, if i want to stay sane.
race relations report
my campaign for becoming queen of nz is gaining momentum, in that i have now doubled the number of my willing subjects from 1 to 2. a significant increase in percentage terms. now i only have to convince at least 1,999,999 other people, and i'm in there with a solid chance.
the race relations report covering 2010 (pdf) is now out, and i have received my own copy. i haven't had time to read it just yet, but i understand from checkpoint that the number of complaints by muslims has increased from fifty-something in 2009 to 71 in 2010. the trouble is that we can't tell if this represents a higher level of discrimination, or people understanding the complaints process better and/or being more willing to lodge a complaint.
my own gut feeling is that things weren't any different last year to the way the way they were in 2009. most often, the kind of nz'ers who will harass or discriminate react most to overseas events. and the community centre near ground zero did result in some pretty nasty media coverage & nastiness in public spaces on the internet. the pastor who, with his small congregation, was all set to burn copies of the qur'an probably did muslims around the world a great deal of good, due to the genral revulsion he caused.
overseas, it will be interesting to see how the unrest in northern africa and the middle east will affect local perceptions of muslims. like it or not, even though a larger number of muslims live outside the middle east than within it, perceptions of muslims are greatly determined by events in the middle east. the current round of protests have had widespread coverage in the western media, and we have finally heard the voices of every day people. i've decided that frank bunce is a wonderful person, after watching his trip through egypt on intrepid journeys (which you can watch on the tvnz site if you missed it, see here). this and news reports brought that monolith called "arab" down to ordinary people with simple dreams, and has helped westerners to identify with their struggles.
despite this, the republican party in america is doing it's best to ensure demonisation of muslims continues, with the inquiry led by representative peter king. the topic of the hearing is "the extent of the radicalisation of american muslims". that the whole thing is a farce can be seen from this article in the new york times. CAIR weren't allowed to testify orally at the hearings, but here is a copy of their written testimony. here is the testimony of representative keith ellison, a muslim:
as a result of this hearing, harassment of muslims in america is on the rise again. there are too many examples to list, but below is a video of a protest in orange county against muslims who were attending a charity event to raise money for women's shelter. i haven't watched the whole video, i couldn't do it. i stopped at hearing the chants of "go home now" in the first minute, as i found it too upsetting, so a trigger-warning for those who have difficulty watching bigotry in action:
coming back to race relations in nz, i guess we should be thankful that we don't have to suffer this sort of thing here. we're certainly way better off than our counterparts in america, and also better off than the muslims of libya, bahrain, yemen, and saudi arabia. we have peace, we are generally free from extreme harassment and violence. but even so, things are far from perfect and i reject the notion that because those in other countries have it much worse, we should be silent about discrimination in this country.
it's election year this year, and all members of minority communities brace themselves as politicians grow ever belligerent in their use of rhetoric against us. the attack is on the maori community just now, given the foreshore & seabed law is currently being debated, and ACT is right at the forefront of the worst of it. but mr peters is looking for a comeback, and as the pressure mounts, national may well join in.
hopefully i'll get around to reading the report soon. i hope you will as well.
colour of food
been a bit slack on the posting here again. but i have some posts up at the hand mirror: my speech about poverty on international women's day, a post on commercial surrogacy and why i'm opposed to it, and finally a post tonight about some wonderful women doing wonderful things on screen.
of course i've been overwhelmed, as has everyone else, by the disaster in japan. such a massive tragedy, with the potential to get worse. i have nothing meaningful to say about this, other than i feel deeply for the people affected.
there are many things to write about, but i'm too tired just now. so i'll link to this piece on the colour of food (hat tip to the lovely ruth), which looks at the inequities people of colour face in the food industry. this graph gives an inkling of the scale of the problem:
well, it's been a few days since i commented here, but i have been writing over at the hand mirror. i wrote this piece about attending the launch of nz book month (and mostly i went to get my mind off things), which happened on the same day that news came out that the government would no longer fund tvnz7 after june next year. not that there was any press release from the government or any other reporting - i heard about it on facebook. and yes, since i wrote that piece last week, i'm still pretty angry.
i also wrote posts about simon power retiring, and linked to an excellent piece about the 3 cities christchurch has become in terms of the response to the earthquake. yesterday, i found myself being a sportswriter (who would have thought), writing about the assault charges against benji marshall.
this evening, i've put up a speech that was given at an international women's day event in hamilton, which had the theme "poverty, why should we give a damn". it was given by a friend of mine who is also on the board of shama, and i really liked the way she talked dealing with poverty, not on the basis of morality but on the basis of rightful demands. i also gave a speech at this event, and i'll put that up in a day or two.
there were several wonderful speakers, including julie timmins from the child poverty action group, angelina greensill, leafa williams from the waikato museum, jane stevens from community waikato, and many others. these women were inspiring advocates,
there was, however, one disappointment to the day. mayor julie hardaker was scheduled to speak. she did turn up, and she did in fact speak. for less than two minutes. and all she had to say was that we should have a positive approach, and that if we wanted change, women should stand for leadership positions.
given the depth and the passion of the speakers that had gone before her and who came after, it just sounded very glib and hollow. i'm sure she's incredibly busy, but even so, it would have been nice if she had listened to more than just part of one other speech and it would have been nicer if she had actually engaged with the topic and the real challenges all of us need to deal with. she is actually in a position to make a difference, but didn't address what policies, projects or actions she was currently undertaking or might undertake in the future to deal with poverty. in fact, she showed no interest in the subject at all, and i think it would have been much better if she hadn't come at all.
finally, i'd like to finish with this clip (hat tip to maia) in tribute to the unions and protesters in wisconsin:
still dealing with a death
i'm still feeling a little icky today - not a great descriptive word, but i can't seem to find anything more appropriate. i wrote yesterday at the hand mirror about a death in our community which has affected me quite deeply. but more than that, i'm still struggling with images from my participation in washing the body. i had a couple of nightmares last night, and i'm feeling somehow unsettled. i don't understand it, because this is certainly not the first time i've done this, but perhaps it's because it was someone i'm much closer to.
we had the funeral prayers at the mosque today. family members were looking a little better than yesterday, but still understandably stressed. the act of letting the body go, of watching it leave the house knowing that this person will never return, well that really is the hardest part in dealing with a death. for a christian services i've attended, i've found the most difficult part is watching the body leave the church. i've never attended a burial, i don't think i could stand it.
i know death is a part of life, we've had plenty of reminders of that this week. if not from christchurch, then from the middle east and from various other bits of news around the world.
sorry to be so depressing. on a more cheerful note, it's nz book month and a few weeks ago i was asked to write about a book that had "changed my life". i may put that up on the blog later. tomorrow is the official launch, which i'm hoping to attend.
and back to the depressing stuff, here is a link telling us why christchurch is actually three cities right now, not just won (hat tip to maia).

redpajama_set_name: RedPajamaCommonCrawl


text:
package com.custommapsapp.android;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Point;
import android.os.Build;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * ImageOrientationDetector tries to determine the orientation of a JPEG image
 * based on the EXIF data stored in the image. These methods are not available
 * in Android versions before 2.0 (SDK 5). In earlier Android versions this
 * class always reports that the images do not require rotation.
 *
 * @author Marko Teittinen
 */
public class ImageHelper {
  private static final String LOG_TAG = "Custom Maps";

  @SuppressWarnings("unchecked")
  private static Class EXIF_CLASS;
  @SuppressWarnings("unchecked")
  private static Constructor EXIF_CONSTRUCTOR;

  private static int EXIF_ORIENTATION_UNDEFINED;
  private static int EXIF_ORIENTATION_NORMAL;
  private static int EXIF_ORIENTATION_ROTATE_90;
  private static int EXIF_ORIENTATION_ROTATE_180;
  private static int EXIF_ORIENTATION_ROTATE_270;
  private static Method EXIF_GET_ATTRIBUTE_INT;
  private static Method EXIF_SET_ATTRIBUTE;
  private static Method EXIF_SAVE_ATTRIBUTES;

  static {
    try {
      EXIF_CLASS = ClassLoader.getSystemClassLoader().loadClass("android.media.ExifInterface");
      EXIF_ORIENTATION_UNDEFINED = EXIF_CLASS.getField("ORIENTATION_UNDEFINED").getInt(null);
      EXIF_ORIENTATION_NORMAL = EXIF_CLASS.getField("ORIENTATION_NORMAL").getInt(null);
      EXIF_ORIENTATION_ROTATE_90 = EXIF_CLASS.getField("ORIENTATION_ROTATE_90").getInt(null);
      EXIF_ORIENTATION_ROTATE_180 = EXIF_CLASS.getField("ORIENTATION_ROTATE_180").getInt(null);
      EXIF_ORIENTATION_ROTATE_270 = EXIF_CLASS.getField("ORIENTATION_ROTATE_270").getInt(null);
      EXIF_CONSTRUCTOR = EXIF_CLASS.getConstructor(String.class);
      EXIF_GET_ATTRIBUTE_INT = EXIF_CLASS.getMethod("getAttributeInt", String.class, int.class);
      EXIF_SET_ATTRIBUTE = EXIF_CLASS.getMethod("setAttribute", String.class, String.class);
      EXIF_SAVE_ATTRIBUTES = EXIF_CLASS.getMethod("saveAttributes");
    } catch (Exception ex) {
      EXIF_CLASS = null;
      if (Build.VERSION.SDK_INT >= 5) {
        Log.e(LOG_TAG, "Failed to initialize ImageHelper. SDK: " + Build.VERSION.SDK_INT, ex);
      }
    }
  }

  /**
   * @return number of degrees the image needs to be rotated clockwise to be
   *         displayed the right way up. 0 means no rotation is necessary, 90
   *         indicates image needs to be rotated 90 degrees clockwise to display
   *         correctly, and so on.
   */
  public static int readOrientation(String imageName) {
    // ExifInterface is not available until SDK 5
    if (Build.VERSION.SDK_INT < 5 || EXIF_CLASS == null || !isJpegName(imageName)) {
      return 0;
    }

    // Use reflection to access class ExifInterface from SDK 5 an above
    try {
      Object exifInstance = EXIF_CONSTRUCTOR.newInstance(imageName);
      int orientation = getExifOrientation(exifInstance);
      if (orientation == EXIF_ORIENTATION_NORMAL || orientation == EXIF_ORIENTATION_UNDEFINED) {
        return 0;
      } else if (orientation == EXIF_ORIENTATION_ROTATE_90) {
        return 90;
      } else if (orientation == EXIF_ORIENTATION_ROTATE_180) {
        return 180;
      } else if (orientation == EXIF_ORIENTATION_ROTATE_270) {
        return 270;
      }
      // Unexpected values fall through past exception handling
      Log.w(LOG_TAG, "Unexpected image orientation: " + orientation);
    } catch (Exception ex) {
      Log.e(LOG_TAG, "Failed to determine image orientation. SDK: " + Build.VERSION.SDK_INT, ex);
    }
    // Return "not rotated" image in all error cases
    return 0;
  }

  /**
   * Decodes only image size for InputStream.
   *
   * @param in InputStream containing the bitmap
   * @return BitmapFactory.Options with size fields populated.
   */
  public static BitmapFactory.Options decodeImageBounds(InputStream in) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;
    options.inTargetDensity = 0;
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(in, null, options);
    return options;
  }

  /**
   * Load a bitmap from a file.
   *
   * @param filename
   * @return Bitmap from named file, or 'null' in case of errors
   */
  public static Bitmap loadImage(String filename) {
    InputStream in = null;
    try {
      in = new BufferedInputStream(new FileInputStream(filename));
      return loadImage(in);
    } catch (Exception ex) {
      Log.e(LOG_TAG, "Failed to load image: " + filename, ex);
      return null;
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (IOException ex) {
          // Ignore
        }
      }
    }
  }

  /**
   * Load a bitmap from InputStream and catch OutOfMemoryErrors.
   *
   * @param in InputStream containing the bitmap
   * @return Bitmap from InputStream, or 'null' in case of errors
   */
  public static Bitmap loadImage(InputStream in) {
    System.gc();
    if (in == null) {
      return null;
    }
    try {
      BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
      bitmapOptions.inScaled = false;
      bitmapOptions.inTargetDensity = 0;
      bitmapOptions.inPurgeable = true;
      bitmapOptions.inInputShareable = true;
      bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
      return BitmapFactory.decodeStream(in, null, bitmapOptions);
    } catch (OutOfMemoryError err) {
      Log.w(LOG_TAG, "Out of memory loading map image", err);
      System.gc();
    }
    return null;
  }

  /**
   * Copies a small region of pixels around a point into a separate bitmap and
   * returns it PNG compressed. The PNG image will be rotated around the point
   * if requested.
   *
   * @param image Bitmap from which to take the sample
   * @param p Center point of the sample
   * @param size Width and height of the sample
   * @param rotation Degrees to rotate the original image around center point
   * @return byte[] containing PNG compressed sample at the point.
   */
  public static byte[] createPngSample(Bitmap image, Point p, int size, int rotation) {
    int halfEdge = size / 2;
    int x = Math.max(0, p.x - halfEdge);
    int y = Math.max(0, p.y - halfEdge);
    int width = Math.min(p.x + halfEdge, image.getWidth()) - x;
    int height = Math.min(p.y + halfEdge, image.getHeight()) - y;
    Matrix rotate = new Matrix();
    rotate.postRotate(rotation, p.x, p.y);
    Bitmap sample = Bitmap.createBitmap(image, x, y, width, height, rotate, false);
    // Compress the sample into a byte[] of PNG data
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
    boolean success = sample.compress(Bitmap.CompressFormat.PNG, 100, buffer);
    sample.recycle();
    return (success ? buffer.toByteArray() : null);
  }

  /**
   * Writes EXIF orientation information to a JPEG image file.
   *
   * @param imageName path to JPEG file to be modified
   * @param degrees number of degrees image needs to be rotated to be viewed.
   *        This value should be 0, 90, 180, or 270.
   * @return {@code true} if the orientation was successfully save to file
   */
  public static boolean writeOrientation(String imageName, int degrees) {
    // ExifInterface is not available until SDK 5
    if (Build.VERSION.SDK_INT < 5 || EXIF_CLASS == null || !isJpegName(imageName)) {
      return false;
    }
    int orientationValue = 1;
    switch (degrees) {
      default:
      case 0:
        return true;
      case 90:
        orientationValue = EXIF_ORIENTATION_ROTATE_90;
        break;
      case 180:
        orientationValue = EXIF_ORIENTATION_ROTATE_180;
        break;
      case 270:
        orientationValue = EXIF_ORIENTATION_ROTATE_270;
        break;
    }
    try {
      Object exifInstance = EXIF_CONSTRUCTOR.newInstance(imageName);
      writeExifOrientation(exifInstance, orientationValue);
      return true;
    } catch (Exception ex) {
      Log.e(LOG_TAG, "Failed to store image orientation to file", ex);
    }
    return false;
  }

  /**
   * @param filename
   * @return {@code true} if the filename is a JPEG file name (ends with .jpg or
   *         .jpeg, case insensitive)
   */
  private static boolean isJpegName(String filename) {
    if (filename == null) {
      return false;
    }
    String lowerCase = filename.toLowerCase();
    return (lowerCase.endsWith(".jpg") || lowerCase.endsWith(".jpeg"));
  }

  private static int getExifOrientation(Object exifInstance) throws IllegalArgumentException,
      IllegalAccessException, InvocationTargetException {
    return (Integer) EXIF_GET_ATTRIBUTE_INT.invoke(exifInstance, "Orientation", 0);
  }

  private static void writeExifOrientation(Object exifInstance, int orientation)
      throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    EXIF_SET_ATTRIBUTE.invoke(exifInstance, "Orientation", String.valueOf(orientation));
    EXIF_SAVE_ATTRIBUTES.invoke(exifInstance);
  }
}

redpajama_set_name: RedPajamaGithub


text:
1 PostDoc Position "Economic / Business History / History of Science and Technology" (Univ. Wien)
1 /6 OpportunitiesNext >
1 PostDoc Position "Economic / Business History / History of Science and Technology"
Department of Economic and Social History of the Vienna Faculty of Historical and Cultural Studies / ERC project Datarev (Universitätsring 1)
Universitätsring 1
Url (PDF/Website)
https://datarev.univie.ac.at/
Federico D´Onofrio, Department of Economic and Social History of the Vienna Faculty of Historical and Cultural Studies
Post-Doctoral researcher to investigate the relationship between the spread of accounting practices and managerial and technological innovations during the 20th century
The Department of Economic and Social History of the Vienna Faculty of Historical and Cultural Studies is looking for a Post-Doctoral researcher to investigate the relationship between the spread of accounting practices and managerial and technological innovations during the 20th century. The position is open to candidates willing to focus on economic or business history or the history of science and technology. Research projects can have different geographical scopes but they must include regions of Europe.
The Post-doctoral researcher will be part of the DATAREV team, led by Federico D'Onofrio. The project DATAREV, "Leading the first data revolution in European agriculture: farm accountancy data and their impact 1870–1945" is funded by ERC Starting Grant 949722 and investigates the diffusion of farm accountancy offices in continental Europe since the 1870s and the use of farm accountancy data by state and non-state actors in the first half of the 20th century.
The starting date will be determined; the position is limited to 1 year and potentially renewable.
Application package by December 11th latest:
- Letter of motivation
- Research project (max. three pages)
- Scientific curriculum vitae incl. list of publications, list of taught courses and teaching evaluations (if available), list of third-party funding (if available) list of lecturing activities
- Contact addresses for at least two references
- Duration of employment: one year/s
- Extent of Employment: 40 hours/week
- Job grading in accordance with collective bargaining agreement: paragraph 48 VwGr. B1 lit. b (postdoc) with relevant work experience determining the assignment to a particular salary grade
- Doctorate/PhD in economic or business history or in the history of science and technology (or equivalent) obtained less than 4 years before the job starting date
- Experience and knowledge in the area of quantitative economic history and related software
- Knowledge of quantitative and qualitative research as well as statistical methods
- High level of written and oral expression
- Excellent written and spoken English
- Ability to work in a team
The following are also expected:
- Experience in participating in research projects
- Publications in renowned, relevant media (peer-reviewed)
- International talks/lectures - Knowledge of university procedures and structures
- International Experience - Communication and organisational skills
Active participation in research, teaching and administration, this implies:
- Establishment or expansion of an independent research profile
- Participation in DATAREV project (sub-projects SP0 and SP4) and to the common activities of the DATAREV team (including research meetings and reading groups)
- International peer-reviewed publications and talks/lectures
- Participation in the life of the Department of Economic and Social History
Applications including a letter of motivation (German or English) should be submitted via the Job Center to the University of Vienna (http://jobcenter.univie.ac.at) no later than 11.12.2022, mentioning reference number 13722.
For further information please contact D'Onofrio, Federico +43-1-4277-41370.
The University pursues a non-discriminatory employment policy and values equal opportunities, as well as diversity (http://diversity.univie.ac.at/). The University lays special emphasis on increasing the number of women in senior and in academic positions. Given equal qualifications, preference will be given to female applicants.
Human Resources and Gender Equality of the University of Vienna
E-Mail: jobcenter@univie.ac.at
Contact (announcement)
Federico D´Onofrio
E-Mail: federico.donofrio@univie.ac.at
1 PostDoc Position "Economic / Business History / History of Science and Technology" (Univ. Wien), in: H-Soz-Kult, 08.12.2022, <www.hsozkult.de/job/id/job-131458>.
1 / 6 OpportunitiesNext >
Szilvia Steiner
Country Event
rda_languageOfExpression_job


I love avocado but it had never occurred to me to use avocado oil until I came across this recipe. Delightful! I'll be finding new uses for this healthy, flavorful oil so stay tuned. I've reduced the amount of cheese in this recipe and increased the jicama for a slightly healthier version.
In a large bowl, whisk avocado oil and lime juice together. Add jicama strips and arugula and toss gently to coat. Divide salad evenly onto 4 plates, then top with sliced avocado and goat cheese. Sprinkle with sea salt and a touch of black pepper.
I took a stunning photo of this dish. Then I did something silly and lost it a bit later. If it make this again soon, I'll replace the photo.


Having more supplementary reserves and independence for your websites is always a glorious opportunity. The semi dedicated server solutions supplied by NTC Hosting are properly arrayed with everything more visited web portals would demand for swifter web page loading under intense Internet traffic conditions. Matched with Virtual Private Server accounts, the semi-dedicated hosting accounts also offer unlimited domain web hosting options, but bring a lot more CPU and semi-dedicated web server freedom, because of the less semi-dedicated hosting account holders utilizing the same very staunch server. In addition, you still get the semi-dedicated hosting server industry's number one Control Panel - Hepsia. As a standard tool, at no further fee. You will highly esteem the user-friendly File Manager, the Domain Manager and the Email Manager, the 1-click Web Apps Installer and the Site Creation Tool menus.


MIT has identified the Metropolitan Warehouse as a renewal and redevelopment opportunity. Originally designed by Peabody & Stearns and built in 1895, MET Warehouse is one of the oldest buildings in the neighborhood. With its square brick tower, crenellated corbelled cornice, and small windows, it resembles a medieval castle on a city street corner. The renovation project will endeavor to preserve the integrity and appearance of this historic architecture.
While plans for the entire MET Warehouse are ongoing, MIT is moving forward with steps to outfit the 1st floor with 20,000 sq. ft. of makerspace. Led by Project Manus, this will become the largest academic makerspace in the world and dramatically enhance students' ability to learn, train, and make passion projects and entrepreneurial prototypes.
Located near the heart of campus and across from the Stratton Student Center, this 'Innovation Hub West' will demonstrate MIT's commitment to providing students with best in class opportunities for hands-on, self-directed learning.


text:
Our product range includes a wide range of victoria memorial holiday package and marble palace holiday package.
Victoria Memorial Holiday Package
No of Days 5 Days
Kolkata (also known as Calcutta) is the capital of the Istate of West Bengal. Located on the east bank of the River Hooghly, it is the principal commercial, cultural, and educational centre of East India, while the Port of Kolkata is India's oldest operating port as well as its sole major riverine port.
Marble Palace Holiday Package
Requirement Flight, Hotel
Sorrounded by a beautiful garden, the palace houses a rare collection of antiques of immense artistic and historical value. The Howrah Bridge The Howrah Bridge spans the River Hooghly River and serves as the gateway to Kolkata, connecting it to the Howrah Station, which is one of the four intercity train stations serving Howrah and Kolkata. As such, it ca
Writer's Building It was designed by Thomas Lyon in 1780 and received an impressive Corinthian facade in 1889. It originally served as the office of the British East India Company. Now, it serves as the Secretariat of the Government of West Bengal.
Botanical Gardens At 9kms from Kolkata, on the west bank of the River Ganges, the botanical cover an area of approximatel 273 acres. Laid out in the year 1787, the Indian Botanical Garden is one of the oldest and largest botanical gardens of India. It contains about 12,000 living perennial plants and millions of dried out plants gathered from all over the world. The 250-year-old Banyan tree with more than 2,800 prop roots is the main attraction.
Park Street Mother Teresa Sarani, formerly Park Street and still often called by that name, was originally named Burial Ground Road on account of the South Park Street Cemetery which has cenotaphs and tombs of prominent figures from the British Raj era and Kolkata's Armenian population. It has been the recreation zone for Kolkata people since the British era, with many restaurants and pubs. It is often known as "Food Street" and "The Street that Never Sleeps".
Sarnath Holiday Package
Konark Sun Temple Holiday Packages
Elephanta Island Jalgaon Holiday Package
Brihadisvara Temple Thanjavur Holiday Package
Munnar Chinnakanal Holiday Package


After doing development work in Africa for 8 years, Ms. Hector has now found her calling as a teacher. She decided to pursue a teaching career after doing projects in Africa because she thought teaching would be a good profession to be more involved in the local community. Over the summer, Ms. Hector learned to sail in the San Francisco, and how to tackle the most challenging winds. Her other hobbies include eating in restaurants, hiking, and traveling.


text:
"""Iptables generator."""

__author__ = 'watson@google.com (Tony Watson)'

import datetime
import re
from string import Template  # pylint: disable=g-importing-member

from lib import aclgenerator
from lib import nacaddr
import logging

class Term(aclgenerator.Term):
  """Generate Iptables policy terms."""

  # Validate that term does not contain any fields we do not
  # support.  This prevents us from thinking that our output is
  # correct in cases where we've omitted fields from term.
  _PLATFORM = 'iptables'
  _POSTJUMP_FORMAT = None
  _PREJUMP_FORMAT = Template('-A $filter -j $term')
  _TERM_FORMAT = Template('-N $term')
  _COMMENT_FORMAT = Template('-A $term -m comment --comment "$comment"')
  _FILTER_TOP_FORMAT = Template('-A $term')
  _LOG_FORMAT = Template('-j LOG --log-prefix $term')
  _ACTION_TABLE = {
      'accept': '-j ACCEPT',
      'deny': '-j DROP',
      'reject': '-j REJECT --reject-with icmp-host-prohibited',
      'reject-with-tcp-rst': '-j REJECT --reject-with tcp-reset',
      'next': '-j RETURN'
      }
  _PROTO_TABLE = {
      'icmpv6': '-p ipv6-icmp',
      'icmp': '-p icmp',
      'tcp': '-p tcp',
      'udp': '-p udp',
      'all': '-p all',
      'esp': '-p esp',
      'ah': '-p ah',
      'gre': '-p gre',
      }
  _TCP_FLAGS_TABLE = {
      'syn': 'SYN',
      'ack': 'ACK',
      'fin': 'FIN',
      'rst': 'RST',
      'urg': 'URG',
      'psh': 'PSH',
      'all': 'ALL',
      'none': 'NONE',
      }
  _KNOWN_OPTIONS_MATCHERS = {
      # '! -f' also matches non-fragmented packets.
      'first-fragment': '-m u32 --u32 4&0x3FFF=0x2000',
      'initial': '--syn',
      'tcp-initial': '--syn',
      'sample': '',
      }

  def __init__(self, term, filter_name, trackstate, filter_action, af='inet'):
    """Setup a new term.

    Args:
      term: A policy.Term object to represent in iptables.
      filter_name: The name of the filter chan to attach the term to.
      trackstate: Specifies if conntrack should be used for new connections.
      filter_action: The default action of the filter.
      af: Which address family ('inet' or 'inet6') to apply the term to.

    Raises:
      UnsupportedFilterError: Filter is not supported.
    """
    super(Term, self).__init__(term)
    self.trackstate = trackstate
    self.term = term  # term object
    self.filter = filter_name  # actual name of filter
    self.default_action = filter_action
    self.options = []
    self.af = af

    if af == 'inet6':
      self._all_ips = nacaddr.IPv6('::/0')
      self._ACTION_TABLE['reject'] = ('-j REJECT --reject-with '
                                      'icmp6-adm-prohibited')
    else:
      self._all_ips = nacaddr.IPv4('0.0.0.0/0')
      self._ACTION_TABLE['reject'] = ('-j REJECT --reject-with '
                                      'icmp-host-prohibited')

    self.term_name = '%s_%s' % (self.filter[:1], self.term.name)

  def __str__(self):
    # Verify platform specific terms. Skip whole term if platform does not
    # match.
    if self.term.platform:
      if self._PLATFORM not in self.term.platform:
        return ''
    if self.term.platform_exclude:
      if self._PLATFORM in self.term.platform_exclude:
        return ''

    ret_str = []

    # Don't render icmpv6 protocol terms under inet, or icmp under inet6
    if ((self.af == 'inet6' and 'icmp' in self.term.protocol) or
        (self.af == 'inet' and 'icmpv6' in self.term.protocol)):
      logging.debug(self.NO_AF_LOG_PROTO.substitute(term=self.term.name,
                                                    proto=self.term.protocol,
                                                    af=self.af))
      return ''

    # Term verbatim output - this will skip over most normal term
    # creation code by returning early. Warnings provided in policy.py
    if self.term.verbatim:
      for next_verbatim in self.term.verbatim:
        if next_verbatim.value[0] == self._PLATFORM:
          ret_str.append(str(next_verbatim.value[1]))
      return '\n'.join(ret_str)

    # We don't support these keywords for filtering, so unless users
    # put in a "verbatim:: iptables" statement, any output we emitted
    # would misleadingly suggest that we applied their filters.
    # Instead, we fail loudly.
    if self.term.ether_type:
      raise UnsupportedFilterError('\n%s %s %s %s' % (
          'ether_type unsupported by', self._PLATFORM,
          '\nError in term', self.term.name))
    if self.term.address:
      raise UnsupportedFilterError('\n%s %s %s %s %s' % (
          'address unsupported by', self._PLATFORM,
          '- specify source or dest', '\nError in term:', self.term.name))
    if self.term.port:
      raise UnsupportedFilterError('\n%s %s %s %s %s' % (
          'port unsupported by', self._PLATFORM,
          '- specify source or dest', '\nError in term:', self.term.name))

    # Create a new term
    self._SetDefaultAction()
    if self._TERM_FORMAT:
      ret_str.append(self._TERM_FORMAT.substitute(term=self.term_name))

    if self._PREJUMP_FORMAT:
      ret_str.append(self._PREJUMP_FORMAT.substitute(filter=self.filter,
                                                     term=self.term_name))

    if self.term.owner:
      self.term.comment.append('Owner: %s' % self.term.owner)
    # reformat long comments, if needed
    #
    # iptables allows individual comments up to 256 chars.
    # But our generator will limit a single comment line to < 120, using:
    # max = 119 - 27 (static chars in comment command) - [length of term name]
    comment_max_width = 92 - len(self.term_name)
    if comment_max_width < 40:
      comment_max_width = 40
    comments = aclgenerator.WrapWords(self.term.comment, comment_max_width)
    # append comments to output
    if comments and comments[0]:
      for line in comments:
        if not line:
          continue  # iptables-restore does not like 0-length comments.
        # term comments
        ret_str.append(self._COMMENT_FORMAT.substitute(filter=self.filter,
                                                       term=self.term_name,
                                                       comment=str(line)))

    # Unsupported configuration; in the case of 'accept' or 'next', we
    # skip the rule.  In other cases, we blow up (raise an exception)
    # to ensure that this is not considered valid configuration.
    if self.term.source_prefix or self.term.destination_prefix:
      if str(self.term.action[0]) not in set(['accept', 'next']):
        raise UnsupportedFilterError('%s %s %s %s %s %s %s %s' % (
            '\nTerm', self.term.name, 'has action', str(self.term.action[0]),
            'with source_prefix or destination_prefix,',
            ' which is unsupported in', self._PLATFORM, 'iptables output.'))
      return ('# skipped %s due to source or destination prefix rule' %
              self.term.name)

    # protocol
    if self.term.protocol:
      protocol = self.term.protocol
    else:
      protocol = ['all']
    if self.term.protocol_except:
      raise UnsupportedFilterError('%s %s %s' % (
          '\n', self.term.name,
          'protocol_except logic not currently supported.'))

    (term_saddr, exclude_saddr,
     term_daddr, exclude_daddr) = self._CalculateAddresses(
         self.term.source_address, self.term.source_address_exclude,
         self.term.destination_address, self.term.destination_address_exclude)
    if not term_saddr:
      logging.debug(self.NO_AF_LOG_ADDR.substitute(term=self.term.name,
                                                   direction='source',
                                                   af=self.af))
      return ''
    if not term_daddr:
      logging.debug(self.NO_AF_LOG_ADDR.substitute(term=self.term.name,
                                                   direction='destination',
                                                   af=self.af))
      return ''

    # ports
    source_port = []
    destination_port = []
    if self.term.source_port:
      source_port = self.term.source_port
    if self.term.destination_port:
      destination_port = self.term.destination_port

    # icmp-types
    icmp_types = ['']
    if self.term.icmp_type:
      icmp_types = self.NormalizeIcmpTypes(self.term.icmp_type, protocol,
                                           self.af)

    source_interface = ''
    if self.term.source_interface:
      source_interface = self.term.source_interface

    destination_interface = ''
    if self.term.destination_interface:
      destination_interface = self.term.destination_interface

    log_hits = False
    if self.term.logging:
      # Iptables sends logs to hosts configured syslog
      log_hits = True

    # options
    tcp_flags = []
    tcp_track_options = []
    for next_opt in [str(x) for x in self.term.option]:
      #
      # Sanity checking and high-ports are added as appropriate in
      # pre-processing that is done in __str__ within class Iptables.
      # Option established will add destination port high-ports if protocol
      # contains only tcp, udp or both.  This is done earlier in class Iptables.
      #
      if ((next_opt.find('established') == 0 or
           next_opt.find('tcp-established') == 0)
          and 'ESTABLISHED' not in [x.strip() for x in self.options]):
        if next_opt.find('tcp-established') == 0 and protocol != ['tcp']:
          raise TcpEstablishedError('%s %s %s' % (
              '\noption tcp-established can only be applied for proto tcp.',
              '\nError in term:', self.term.name))

        if self.trackstate:
          # Use nf_conntrack to track state -- works with any proto
          self.options.append('-m state --state ESTABLISHED,RELATED')
        elif protocol == ['tcp']:
          # Simple established-only rule for TCP: Must have ACK field
          # (SYN/ACK or subsequent ACK), or RST and no other flags.
          tcp_track_options = [(['ACK'], ['ACK']),
                               (['SYN', 'FIN', 'ACK', 'RST'], ['RST'])]

      # Iterate through flags table, and create list of tcp-flags to append
      for next_flag in self._TCP_FLAGS_TABLE:
        if next_opt.find(next_flag) == 0:
          tcp_flags.append(self._TCP_FLAGS_TABLE.get(next_flag))
      if next_opt in self._KNOWN_OPTIONS_MATCHERS:
        self.options.append(self._KNOWN_OPTIONS_MATCHERS[next_opt])
    if self.term.packet_length:
      # Policy format is "#-#", but iptables format is "#:#"
      self.options.append('-m length --length %s' %
                          self.term.packet_length.replace('-', ':'))
    if self.term.fragment_offset:
      self.options.append('-m u32 --u32 4&0x1FFF=%s' %
                          self.term.fragment_offset.replace('-', ':'))

    for saddr in exclude_saddr:
      ret_str.extend(self._FormatPart(
          '', saddr, '', '', '', '', '', '', '', '', '', '',
          self._ACTION_TABLE.get('next')))
    for daddr in exclude_daddr:
      ret_str.extend(self._FormatPart(
          '', '', '', daddr, '', '', '', '', '', '', '', '',
          self._ACTION_TABLE.get('next')))

    for saddr in term_saddr:
      for daddr in term_daddr:
        for icmp in icmp_types:
          for proto in protocol:
            for tcp_matcher in tcp_track_options or (([], []),):
              ret_str.extend(self._FormatPart(
                  str(proto),
                  saddr,
                  source_port,
                  daddr,
                  destination_port,
                  self.options,
                  tcp_flags,
                  icmp,
                  tcp_matcher,
                  source_interface,
                  destination_interface,
                  log_hits,
                  self._ACTION_TABLE.get(str(self.term.action[0]))
                  ))

    if self._POSTJUMP_FORMAT:
      ret_str.append(self._POSTJUMP_FORMAT.substitute(filter=self.filter,
                                                      term=self.term_name))

    return '\n'.join(str(v) for v in ret_str if v is not '')

  def _CalculateAddresses(self, term_saddr, exclude_saddr,
                          term_daddr, exclude_daddr):
    """Calculate source and destination address list for a term.

    Args:
      term_saddr: source address list of the term
      exclude_saddr: source address exclude list of the term
      term_daddr: destination address list of the term
      exclude_daddr: destination address exclude list of the term

    Returns:
      tuple containing source address list, source exclude address list,
      destination address list, destination exclude address list in
      that order

    """
    # source address
    term_saddr_excluded = []
    if not term_saddr:
      term_saddr = [self._all_ips]
    if exclude_saddr:
      term_saddr_excluded.extend(nacaddr.ExcludeAddrs(term_saddr,
                                                      exclude_saddr))

    # destination address
    term_daddr_excluded = []
    if not term_daddr:
      term_daddr = [self._all_ips]
    if exclude_daddr:
      term_daddr_excluded.extend(nacaddr.ExcludeAddrs(term_daddr,
                                                      exclude_daddr))

    # Just to be safe, always have a result of at least 1 to avoid * by zero
    # returning incorrect results (10src*10dst=100, but 10src*0dst=0, not 10)
    bailout_count = len(exclude_saddr) + len(exclude_daddr) + (
        (len(self.term.source_address) or 1) *
        (len(self.term.destination_address) or 1))
    exclude_count = ((len(term_saddr_excluded) or 1) *
                     (len(term_daddr_excluded) or 1))

    # Use bailout jumps for excluded addresses if it results in fewer output
    # lines than nacaddr.ExcludeAddrs() method.
    if exclude_count < bailout_count:
      exclude_saddr = []
      exclude_daddr = []
      if term_saddr_excluded:
        term_saddr = term_saddr_excluded
      if term_daddr_excluded:
        term_daddr = term_daddr_excluded

    # With many sources and destinations, iptables needs to generate the
    # cartesian product of sources and destinations.  If there are no
    # exclude rules, this can instead be written as exclude [0/0 -
    # srcs], exclude [0/0 - dsts].
    v4_src_count = len([x for x in term_saddr if x.version == 4])
    v4_dst_count = len([x for x in term_daddr if x.version == 4])
    v6_src_count = len([x for x in term_saddr if x.version == 6])
    v6_dst_count = len([x for x in term_daddr if x.version == 6])
    num_pairs = v4_src_count * v4_dst_count + v6_src_count * v6_dst_count
    if num_pairs > 100:
      new_exclude_source = nacaddr.ExcludeAddrs([self._all_ips], term_saddr)
      new_exclude_dest = nacaddr.ExcludeAddrs([self._all_ips], term_daddr)
      # Invert the shortest list that does not already have exclude addresses
      if len(new_exclude_source) < len(new_exclude_dest) and not exclude_saddr:
        if len(new_exclude_source) + len(term_daddr) < num_pairs:
          exclude_saddr = new_exclude_source
          term_saddr = [self._all_ips]
      elif not exclude_daddr:
        if len(new_exclude_dest) + len(term_saddr) < num_pairs:
          exclude_daddr = new_exclude_dest
          term_daddr = [self._all_ips]
    term_saddr = [x for x in term_saddr
                  if x.version == self.AF_MAP[self.af]]
    exclude_saddr = [x for x in exclude_saddr
                     if x.version == self.AF_MAP[self.af]]
    term_daddr = [x for x in term_daddr
                  if x.version == self.AF_MAP[self.af]]
    exclude_daddr = [x for x in exclude_daddr
                     if x.version == self.AF_MAP[self.af]]
    return (term_saddr, exclude_saddr, term_daddr, exclude_daddr)

  def _FormatPart(self, protocol, saddr, sport, daddr, dport, options,
                  tcp_flags, icmp_type, track_flags, sint, dint, log_hits,
                  action):
    """Compose one iteration of the term parts into a string.

    Args:
      protocol: The network protocol
      saddr: Source IP address
      sport: Source port numbers
      daddr: Destination IP address
      dport: Destination port numbers
      options: Optional arguments to append to our rule
      tcp_flags: Which tcp_flag arguments, if any, should be appended
      icmp_type: What icmp protocol to allow, if any
      track_flags: A tuple of ([check-flags], [set-flags]) arguments to tcp-flag
      sint: Optional source interface
      dint: Optional destination interface
      log_hits: Boolean, to log matches or not
      action: What should happen if this rule matches
    Returns:
      rval:  A single iptables argument line
    """
    src, dst = self._GenerateAddressStatement(saddr, daddr)

    filter_top = self._FILTER_TOP_FORMAT.substitute(filter=self.filter,
                                                    term=self.term_name)

    source_int = ''
    if sint:
      source_int = '-i %s' % sint

    destination_int = ''
    if dint:
      destination_int = '-o %s' % dint

    log_jump = ''
    if log_hits:
      log_jump = self._LOG_FORMAT.substitute(term=self.term.name)

    if not options:
      options = []

    proto = self._PROTO_TABLE.get(str(protocol))
    # Don't drop protocol if we don't recognize it
    if protocol and not proto:
      proto = '-p %s' % str(protocol)

    # TODO(vklimovs): generalize to all v6 special cases
    # Use u32 module as named modules are not available
    # everywhere.
    if protocol == 'hop-by-hop':
      proto = ''
      # Select 4 bytes at offset 0x3, mask out all but
      # last byte. That produces byte at position 7,
      # Next Header. Compare to 0x0, Hop By Hop
      options.append('-m u32 --u32 "0x3&0xff=0x0"')
    if protocol == 'fragment':
      proto = ''
      # Ditto, but compare to 0x2c, 44, Fragment
      options.append('-m u32 --u32 "0x3&0xff=0x2c"')

    # set conntrack state to NEW, unless policy requested "nostate"
    if self.trackstate:
      already_stateful = False
      # we will add new stateful arguments only if none already exist, such
      # as from "option:: established"
      for option in options:
        if 'state' in option:
          already_stateful = True
      if not already_stateful:
        if 'ACCEPT' in action:
          # We have to permit established/related since a policy may not
          # have an existing blank permit for established/related, which
          # may be more efficient, but slightly less secure.
          options.append('-m state --state NEW,ESTABLISHED,RELATED')

    if tcp_flags or (track_flags and track_flags[0]):
      check_fields = ','.join(sorted(set(tcp_flags + track_flags[0])))
      set_fields = ','.join(sorted(set(tcp_flags + track_flags[1])))
      flags = '--tcp-flags %s %s' % (check_fields, set_fields)
    else:
      flags = ''

    icmp_type = str(icmp_type)
    if not icmp_type:
      icmp = ''
    elif str(protocol) == 'icmpv6':
      icmp = '-m icmp6 --icmpv6-type %s' % icmp_type
    else:
      icmp = '--icmp-type %s' % icmp_type

    # format tcp and udp ports
    sports = dports = ['']
    if sport:
      sports = self._GeneratePortStatement(sport, source=True)
    if dport:
      dports = self._GeneratePortStatement(dport, dest=True)

    ret_lines = []
    for sport in sports:
      for dport in dports:
        rval = [filter_top]
        if re.search('multiport', sport) and not re.search('multiport', dport):
          # Due to bug in iptables, use of multiport module before a single
          # port specification will result in multiport trying to consume it.
          # this is a little hack to ensure single ports are listed before
          # any multiport specification.
          dport, sport = sport, dport
        if str(protocol) == 'icmpv6':
          # Due to a bug in ip6tables, iptables-save returns icmpv6 matches in
          # order (address spec) (icmpv6 spec). Fake this using options
          # datastructure.
          options.extend((proto, icmp))
          proto = ''
          icmp = ''
        if (str(self.af) == 'inet6' and
            str(protocol) == 'all' and
            'REJECT' in str(action)):
          # Due to a bug in ip6tables, when -p all and -j REJECT, proto
          # is being eaten
          proto = ''
        for value in (proto, flags, sport, dport, icmp, src, dst,
                      ' '.join(options), source_int, destination_int):
          if value:
            rval.append(str(value))
        if log_jump:
          # -j LOG
          ret_lines.append(' '.join(rval+[log_jump]))
        # -j ACTION
        ret_lines.append(' '.join(rval+[action]))
    return ret_lines

  def _GenerateAddressStatement(self, saddr, daddr):
    """Return the address section of an individual iptables rule.

    Args:
      saddr: source address of the rule
      daddr: destination address of the rule

    Returns:
      tuple containing source and destination address statement, in
      that order

    """
    src = ''
    dst = ''
    if not saddr or saddr == self._all_ips:
      src = ''
    else:
      src = '-s %s/%d' % (saddr.ip, saddr.prefixlen)
    if not daddr or daddr == self._all_ips:
      dst = ''
    else:
      dst = '-d %s/%d' % (daddr.ip, daddr.prefixlen)
    return (src, dst)

  def _GeneratePortStatement(self, ports, source=False, dest=False):
    """Return the 'port' section of an individual iptables rule.

    Args:
      ports: list of ports or port ranges (pairs)
      source: (bool) generate a source port rule
      dest: (bool) generate a dest port rule

    Returns:
      list holding the 'port' sections of an iptables rule.

    Raises:
      BadPortsError: if too many ports are passed in, or if both 'source'
                        and 'dest' are true.
      NotImplementedError: if both 'source' and 'dest' are true.
    """
    if not ports:
      return ''

    direction = ''  # default: no direction / '--port'.  As yet, unused.
    if source and dest:
      raise BadPortsError('_GeneratePortStatement called ambiguously.')
    elif source:
      direction = 's'  # source port / '--sport'
    elif dest:
      direction = 'd'  # dest port / '--dport'
    else:
      raise NotImplementedError('--port support not yet implemented.')

    # Normalize ports and get accurate port count.
    # iptables multiport module limits to 15, but we use 14 to ensure a range
    # doesn't tip us over the limit
    max_ports = 14
    norm_ports = []
    portstrings = []
    count = 0
    for port in ports:
      if port[0] == port[1]:
        norm_ports.append(str(port[0]))
        count += 1
      else:
        norm_ports.append('%d:%d' % (port[0], port[1]))
        count += 2
      if count >= max_ports:
        count = 0
        portstrings.append('-m multiport --%sports %s' % (direction,
                                                          ','.join(norm_ports)))
        norm_ports = []
    if norm_ports:
      if len(norm_ports) == 1:
        portstrings.append('--%sport %s' % (direction, norm_ports[0]))
      else:
        portstrings.append('-m multiport --%sports %s' %
                           (direction, ','.join(norm_ports)))
    return portstrings

  def _SetDefaultAction(self):
    """If term does not specify action, use filter default action."""
    if not self.term.action:
      self.term.action[0].value = self.default_action

class Iptables(aclgenerator.ACLGenerator):
  """Generates filters and terms from provided policy object."""

  _PLATFORM = 'iptables'
  _DEFAULT_PROTOCOL = 'all'
  SUFFIX = ''
  _RENDER_PREFIX = None
  _RENDER_SUFFIX = None
  _DEFAULTACTION_FORMAT = '-P %s %s'
  _DEFAULTACTION_FORMAT_CUSTOM_CHAIN = '-N %s'
  _DEFAULT_ACTION = 'DROP'
  _TERM = Term
  _TERM_MAX_LENGTH = 24
  _OPTIONAL_SUPPORTED_KEYWORDS = set(['counter',
                                      'destination_interface',
                                      'destination_prefix',  # skips these terms
                                      'expiration',
                                      'fragment_offset',
                                      'logging',
                                      'owner',
                                      'packet_length',
                                      'policer',             # safely ignored
                                      'qos',
                                      'routing_instance',    # safe to skip
                                      'source_interface',
                                      'source_prefix',       # skips these terms
                                     ])
  _GOOD_FILTERS = ['INPUT', 'OUTPUT', 'FORWARD']

  def _WarnIfCustomTarget(self, target):
    """Emit a warning if a policy's default target is not a built-in chain."""
    if target not in self._GOOD_FILTERS:
      logging.warn('Filter is generating a non-standard chain that will not '
                   'apply to traffic unless linked from INPUT, OUTPUT or '
                   'FORWARD filters. New chain name is: %s', target)

  def _TranslatePolicy(self, pol, exp_info):
    """Translate a policy from objects into strings."""
    self.iptables_policies = []
    current_date = datetime.datetime.utcnow().date()
    exp_info_date = current_date + datetime.timedelta(weeks=exp_info)

    default_action = None
    good_default_actions = ['ACCEPT', 'DROP']
    good_afs = ['inet', 'inet6']
    good_options = ['nostate', 'abbreviateterms', 'truncateterms']
    all_protocols_stateful = True

    for header, terms in pol.filters:
      filter_type = None
      if self._PLATFORM not in header.platforms:
        continue

      filter_options = header.FilterOptions(self._PLATFORM)[1:]
      filter_name = header.FilterName(self._PLATFORM)

      self._WarnIfCustomTarget(filter_name)

      # ensure all options after the filter name are expected
      for opt in filter_options:
        if opt not in good_default_actions + good_afs + good_options:
          raise UnsupportedTargetOption('%s %s %s %s' % (
              '\nUnsupported option found in', self._PLATFORM,
              'target definition:', opt))

      # disable stateful?
      if 'nostate' in filter_options:
        all_protocols_stateful = False

      # Check for matching af
      for address_family in good_afs:
        if address_family in filter_options:
          # should not specify more than one AF in options
          if filter_type is not None:
            raise UnsupportedFilterError('%s %s %s %s' % (
                '\nMay only specify one of', good_afs, 'in filter options:',
                filter_options))
          filter_type = address_family
      if filter_type is None:
        filter_type = 'inet'

      if self._PLATFORM == 'iptables' and filter_name == 'FORWARD':
        default_action = 'DROP'

      # does this policy override the default filter actions?
      for next_target in header.target:
        if next_target.platform == self._PLATFORM:
          if len(next_target.options) > 1:
            for arg in next_target.options:
              if arg in good_default_actions:
                default_action = arg
      if default_action and default_action not in good_default_actions:
        raise UnsupportedDefaultAction('%s %s %s %s %s' % (
            '\nOnly', ', '.join(good_default_actions),
            'default filter action allowed;', default_action, 'used.'))

      # add the terms
      new_terms = []
      term_names = set()
      for term in terms:
        term.name = self.FixTermLength(term.name,
                                       'abbreviateterms' in filter_options,
                                       'truncateterms' in filter_options)
        if term.name in term_names:
          raise aclgenerator.DuplicateTermError(
              'You have a duplicate term: %s' % term.name)
        term_names.add(term.name)

        term = self.FixHighPorts(term, af=filter_type,
                                 all_protocols_stateful=all_protocols_stateful)
        if not term:
          continue

        if term.expiration:
          if term.expiration <= exp_info_date:
            logging.info('INFO: Term %s in policy %s expires '
                         'in less than two weeks.', term.name, filter_name)
          if term.expiration <= current_date:
            logging.warn('WARNING: Term %s in policy %s is expired and '
                         'will not be rendered.', term.name, filter_name)
            continue

        new_terms.append(self._TERM(term, filter_name, all_protocols_stateful,
                                    default_action, filter_type))

      self.iptables_policies.append((header, filter_name, filter_type,
                                     default_action, new_terms))

  def SetTarget(self, target, action=None):
    """Sets policy's target and default action.

    Args:
      target: (string) target name
      action: (string) default action, only valid if target is a built-in chain
    """
    # there is only one item in iptables_policies
    pol = list(self.iptables_policies[0])
    pol[1] = target
    self._WarnIfCustomTarget(target)
    if action:
      pol[3] = action
    self.iptables_policies[0] = tuple(pol)

  def __str__(self):
    target = []
    pretty_platform = '%s%s' % (self._PLATFORM[0].upper(), self._PLATFORM[1:])

    if self._RENDER_PREFIX:
      target.append(self._RENDER_PREFIX)

    for (header, filter_name, filter_type, default_action, terms
        ) in self.iptables_policies:
      # Add comments for this filter
      target.append('# %s %s Policy' % (pretty_platform,
                                        header.FilterName(self._PLATFORM)))

      # reformat long text comments, if needed
      comments = aclgenerator.WrapWords(header.comment, 70)
      if comments and comments[0]:
        for line in comments:
          target.append('# %s' % line)
        target.append('#')
      # add the p4 tags
      target.extend(aclgenerator.AddRepositoryTags('# '))
      target.append('# ' + filter_type)

      if filter_name in self._GOOD_FILTERS:
        if default_action:
          target.append(self._DEFAULTACTION_FORMAT % (filter_name,
                                                      default_action))
        elif self._PLATFORM == 'speedway':
          # always specify the default filter states for speedway,
          # if default action policy not specified for iptables, do nothing.
          target.append(
              self._DEFAULTACTION_FORMAT % (filter_name, self._DEFAULT_ACTION))
      else:
        # Custom chains have no concept of default policy.
        target.append(self._DEFAULTACTION_FORMAT_CUSTOM_CHAIN % filter_name)
      # add the terms
      for term in terms:
        term_str = str(term)
        if term_str:
          target.append(term_str)

    if self._RENDER_SUFFIX:
      target.append(self._RENDER_SUFFIX)

    target.append('')
    return '\n'.join(target)

class Error(Exception):
  """Base error class."""

class BadPortsError(Error):
  """Too many ports for a single iptables statement."""

class UnsupportedFilterError(Error):
  """Raised when we see an inappropriate filter."""

class NoIptablesPolicyError(Error):
  """Raised when a policy is received that doesn't support iptables."""

class TcpEstablishedError(Error):
  """Raised when a term has tcp-established option but not proto tcp only."""

class EstablishedError(Error):
  """Raised when a term has established option with inappropriate protocol."""

class UnsupportedDefaultAction(Error):
  """Raised when a filter has an impermissible default action specified."""

class UnsupportedTargetOption(Error):
  """Raised when a filter has an impermissible default action specified."""


Expected end of 2016 Apr-May 2016 (should have been 2015 there, but , yeah, it's delayed. The bright side I'm updating for 9.3 changes as well).
It's a $%#$%$#% herculean effort, but I'm on it. Bear with me. It'll be worth the wait..
The TOC for Volume II is also out. Requests/Comments welcome.
10.1 - Puma -a Stronger Feline, but . . .
The Future of OS X Obviously in need of an update..
Mac devices Listing Hardware profiles and KEXts in..