dimension-data
Businessmodel of Dimension Data
Customer Segments
Dimension Data provides a range of IT solutions to companies across multiple industries and geographic regions. Its products are targeted in particular at clients within the following sectors:
- Financial Services, including the provision of regulatory compliance and security, electronic trading and visual channel banking solutions to banking and financial institutions;
- Manufacturing, including the provision of integrated intellectual property network, technical design and security, and industrial ethernet and wireless solutions to original equipment manufacturers, semiconductor companies and other industrial manufacturers;
- Media and Communications, including the provision of enterprise network, security, and revenue network solutions to media houses, publishing companies and broadcasters.
- Public Sector, including the provision of virtualisation, contact centre and cloud computing services to public bodies and government agencies; and
- Multinational Corporates, including the provision of IT infrastructure, networking and data security services to large multinational conglomerates. Among the Company’s customers are well-known companies such as Adobe, Mattel, SAP, Thomson Reuters, MediServe and Appian.
Dimension Data serves customers across the Americas, Asia, Australia, Europe, and the Middle East and Africa.
Value Propositions
Dimension Data provides value to its customers in the following ways:
- The quality of its products and services, including a broad range of IT solutions and products that cover the needs of customers across multiple business sectors;
- The reach of its marketing and sales channels, with the Company serving clients across the Americas, Asia, Australia, Europe, and the Middle East and Africa;
- Its industry expertise, including specialist integration, data centre, IT security and storage personnel; and
- Its function as a subsidiary of a well-known and well-reputed communications group, having operated as a subsidiary of NTT. ### Channels
Dimension Data operates a website at www.dimensiondata.com, where customers are able to view and find information on the Company’s services and solutions and business operations. The Company, however, does not operate an online sales channel.
The majority of Dimension Data’s sales are made by its in-house direct sales teams, which are organised on a regional basis. The Company has a presence in all of its operating regions, including offices in the US, Brazil, Australia, the UK, South Africa, and China.
Dimension Data’s sales operations are supported by a network of resellers and independent sales agents that help to extend the Company’s marketing reach.
Customer Relationships
While Dimension Data operates a website, its products are not available to customers on a self-service basis. The Company’s sales instead are made through its direct sales teams, with customers consulting directly with Company representatives in order to ensure that their individual needs are met. Dimension Data aims to establish long-standing relationships with its customers, with many clients providing recurring business to the Company.
Dimension provides technical support and assistance to clients as part of its full suite of services. It also provides customers with personalised advice and support through an online chat service and telephone assistance, as well as through a portfolio of online learning resources such as user guides and tutorials.
Additionally, customers are able to interact directly with the Company through its social media accounts, including with Facebook, Twitter and YouTube.
Key Activities
Dimension Data provides a range of IT solutions and services to companies across multiple business sectors and jurisdictions. It primarily offers IT-as-a-service solutions, such as cloud advisory services, cloud and managed contact centre services, cloud infrastructure solutions, and enterprise mobility-as-a-service products.
The company additionally provides systems integration services, including consulting and professional services, managed services, managed services for data centres, and support services; procurement and logistics services; and information technology outsourcing services. Dimension Data serves industries, such as financial services, manufacturing, media and communications, multinational business, and public sector.
Key Partners
Dimension Data collaborates with a range of customers throughout the development and distribution of its products and services. Its various partnerships are categorised as follows:
- Strategic Alliance Partners, with which it shares tools and technology and collaborates on joint-venture projects;
- Technology Partners, which provide assistance in the development, integration and implementation of the Company’s IT solutions;
- OneCloud Partners, assisting service providers, educational institutions, government agencies and trading communities bring cloud platform services to market; and
- Preferred Partners, through which the Company provides professional and managed services for multi-vendor solutions. Among Dimension Data’s partners are Cisco, HP, IBM, Intel Security, Microsoft, and Oracle.
Key Resources
Dimension Data’s key resources are its technology and IT solutions, its IT infrastructure, its partnerships, its sales and distribution channels, and its personnel – notably its sales and support staff. Searches of records published by the US Patent and Trademark Office identified no patent applications filed in the name of Dimension Data.
Cost Structure
Dimension Data incurs costs in relation to the development of its IT solutions, the maintenance of its IT infrastructure, the management of its partnerships, the operation of its sales and distribution channels and the retention of its personnel. The Company’s most significant costs relate to its general operation and administration.
Dimension Data employs a workforce of around 31,000 worldwide, accruing costs in the form of salaries and benefits, and operates a network of offices across 58 countries, representing costs in the form of rent and utilities.
Revenue Streams
Dimension Data generates revenue through the sale of IT services and solutions, including systems integration, internet solutions, planning, building, support and management services. The Company breaks its revenue down into three streams:
- Products, including revenue generated by the one-off sale of non-proprietary products;
- Managed Services, including revenue generated by the provision of recurring IT services; and
- Professional Services, including revenue generated by the provision of project-based services. Dimension Data is no longer a publicly-listed company and, as such, is not obliged to publish its financial performance figures. Reports, however, suggest that the Company recorded $7.5 billion in 2014, and was on track to generate $8 billion in annual revenue in 2015.


public static class StaticMap.Path.Style.Builder
extends java.lang.Object
| Constructor and Description |
|---|
StaticMap.Path.Style.Builder() |
| Modifier and Type | Method and Description |
|---|---|
StaticMap.Path.Style |
build() |
StaticMap.Path.Style.Builder |
color(int color)
Specifies a 24-bit or 32-bit color
|
StaticMap.Path.Style.Builder |
fill(int color)
Indicates both that the path marks off a polygonal area
and specifies the fill color to use as an overlay within that area.
|
StaticMap.Path.Style.Builder |
geodesic() |
StaticMap.Path.Style.Builder |
geodesic(boolean geodesic)
Indicates that the requested path should be interpreted
as a geodesic line that follows the curvature of the Earth.
|
StaticMap.Path.Style.Builder |
stroke(int width)
Specifies the thickness of the path in pixels.
|
public StaticMap.Path.Style.Builder stroke(int width)
width
- in pixelpublic StaticMap.Path.Style.Builder color(int color)
color
- ARGBpublic StaticMap.Path.Style.Builder fill(int color)
color
- ARGBpublic StaticMap.Path.Style.Builder geodesic(boolean geodesic)
geodesic
- (default to false)public StaticMap.Path.Style.Builder geodesic()
geodesic(boolean)
public StaticMap.Path.Style build()


Practical Virtual Reality
In 2018, as part of the Education & Training Foundations' Outstanding Teaching Learning & Assessment grant programme, a partnership of Sussex further education providers explored the effective use of 360°, augmented and virtual reality technologies within the classroom.
This website is an interactive guide for educators to learn how they can start experimenting with immersive technologies within their teaching.


Software Engineer with 10 years of experience in full-stack software development with the ability of leading team.
Well-versed in building web applications and REST APIs in different technology stacks. Competent in OOP, declarative programming, architectural patterns like MVC, MVP and MVVM. Vastly knowledgable in mobile app ecosystem with development experience in both native and cross-platform framworks. Eager to learn, embrace and discuss about new technologies, ardent to implement popular design patterns and coding standards. Engrossed in motivating team to bring about maximum output.
Neura Robotics GmbH Metzingen, Germany
Full Stack Engineer 08/2022 - OngoingRed.Digital Limited Dhaka, Bangladesh
Principal Software Developer 05/2021 - 07/2022Robi Axiata Limited Dhaka, Bangladesh
Software Engineer (Code Athlete) 05/2018 - 01/2021 Robi Axiata is the second largest telecom in BangladeshGreen and Red Technologies Limited Dhaka, Bangladesh
Senior Software Engineer (Head of Technology) 01/2015 - 05/2018Mangoes Mobile Limited Dhaka, Bangladesh
Senior Android Developer 04/2011 - 03/2013 ManGoes Mobile is focused on solving fundamental problems using mobile platformMost of the things I learned in my career, I learned by myself
Loyalty & PerseveranceI stayed with the team during tough time and helped overcome it
Capability to Motivate TeamI am a leader more than a boss. I am a friend more than a leader
Executive Masters in CS
Jahangirnagar UniversityBSc. in CS and ECE
BRAC UniversityNational Hackathon (2014)
1 of Top 20 Ideas - BoiplobikStartup Weekend (2013)
1 of Top 10 Projects - Crime MapIT Innovation Search Program (2012)


Relevant coursework:
| CS 168: Internet Architecture and Protocols | CS 188: Intro to Artificial Intelligence |
| CS 169: Software Engineering | CS 189: Machine Learning |
| CS 170: Efficient Algorithms and Intractable Problems | INFO 259: Natural Language Processing |
Took a three-year hiatus from my career to pursue passions beyond building cool products.


nips nips2002 nips2002-113 nips2002-113-reference knowledge-graph by maker-knowledge-mining
Source: pdf
Author: Guy Lebanon, John D. Lafferty
Abstract: A new family of kernels for statistical learning is introduced that exploits the geometric structure of statistical models. Based on the heat equation on the Riemannian manifold deﬁned by the Fisher information metric, information diffusion kernels generalize the Gaussian kernel of Euclidean space, and provide a natural way of combining generative statistical modeling with non-parametric discriminative learning. As a special case, the kernels give a new approach to applying kernel-based learning algorithms to discrete data. Bounds on covering numbers for the new kernels are proved using spectral theory in differential geometry, and experimental results are presented for text classiﬁcation.
[1] S. Amari and H. Nagaoka. Methods of Information Geometry, volume 191 of Translations of Mathematical Monographs. American Mathematical Society, 2000.
[2] A. Grigor’yan and M. Noguchi. The heat kernel on hyperbolic space. Bulletin of the London Mathematical Society, 30:643–650, 1998.
[3] Y. Guo, P. L. Bartlett, J. Shawe-Taylor, and R. C. Williamson. Covering numbers for support vector machines. IEEE Trans. Information Theory, 48(1), January 2002.
[4] T. S. Jaakkola and D. Haussler. Exploiting generative models in discriminative classiﬁers. In Advances in Neural Information Processing Systems, volume 11, 1998.
[5] T. Joachims, N. Cristianini, and J. Shawe-Taylor. Composite kernels for hypertext categorisation. In Proceedings of the International Conference on Machine Learning (ICML), 2001.
[6] R. E. Kass and P. W. Vos. Geometrical Foundations of Asymptotic Inference. Wiley Series in Probability and Statistics. John Wiley & Sons, 1997.
[7] R. I. Kondor and J. Lafferty. Diffusion kernels on graphs and other discrete input spaces. In Proceedings of the International Conference on Machine Learning (ICML), 2002.
[8] P. Li and S.-T. Yau. Estimates of eigenvalues of a compact Riemannian manifold. In Geometry of the Laplace Operator, volume 36 of Proceedings of Symposia in Pure Mathematics, pages 205–239, 1980.
[9] R. Schoen and S.-T. Yau. Lectures on Differential Geometry, volume 1 of Conference Proceedings and Lecture Notes in Geometry and Topology. International Press, 1994.


Speech
Schools Minister David Laws calls on grammar schools to be more open to disadvantaged pupils.
It is a great pleasure to be here today and have the chance to say a few words on social mobility.
I would like to set out how government and grammar schools can work together to help every child succeed, whatever their background.
We may not see eye to eye on every point.
But I do think, between the Department for Education and grammar schools, we share a common goal in wanting to raise expectations, standards and access, so that regardless of a child’s background we offer them the best possible chance to fulfil their potential, in yours and other good and outstanding schools.
It is shameful that, in this country, the best way to predict a child’s exam results is to look at their family income and social background.
Breaking this stubborn attainment gap between richer and poorer pupils is my party’s key objective in the Department for Education. It is what drives me as a minister - it is behind the pupil premium - and it is at the heart of this coalition government’s education policy.
I know that it drives many of you too - and may well be what brought you into teaching in the first place.
The grammar school sector has a long and distinguished history and has been part of the English education system since the Middle Ages. Many of you can trace your school’s history back to the 16th and 17th century, if not earlier.
The political argument of the 1970s, as to whether selective schools should continue in the state sector, resulted in a significant decline in grammar schools. Today just 5% of schools are grammars, compared to a peak of 38% just after the Second World War.
Since the 1980s the number of grammar schools has remained fairly constant at around 164.
No political party now proposes to change this. The debate about grammar schools seems to have been put in the political deep freeze - with no plans either to increase or reduce the number of what are extremely popular schools in their localities.
I am not here to revive arguments about the relative merits of grammar schools and comprehensive schools.
I am here because I accept that grammar schools are a significant feature of the landscape in many local areas, and as Schools Minister I want us to be able to work together openly and constructively on social mobility and other areas
Grammar schools are often excellent schools. I accept them as an established fact of our education system and want to consider what greater role they can play in breaking the cycles of disadvantage and closing the opportunity gap.
I want to work with you, not preach at you, and help you to do what many of you are seeking to do already.
In doing so, I want to challenge you to improve the social mix of your schools, while accepting that the government and the non-selective primary sector also has a big responsibility in this area too. You cannot do this alone.
Many grammar schools were originally established to be engines of social change. Grammar schools were often established by charitable trusts or individual benefactors whose ambitions were to provide for the education of all local children, not just the privileged who could pay for it.
You will be aware of many schools established in the 16th and 17th centuries to help poorer children. Harvey’s Grammar School in Folkestone, for example, was established in 1674 for “20 poor boys of Folkestone”. The Blue Coat School in Liverpool was founded in 1708, and the founders described the school as “a school for teaching poor children to read, write and cast accounts”.
Before we look forward today, I therefore ask you to pause and look back.
How far do you meet those proud aspirations?

Why is entry to grammar schools so often maligned?
In my first month as Schools Minister, back in 2012, I was sitting at my desk in the DfE one day when a pile of answers to parliamentary questions was put before me to approve.
One of them that caught my eye asked how many disadvantaged children attend each English grammar school.
I knew the figures were bad. But as I read down the list of schools I was shocked, genuinely shocked, to see how few children from poor backgrounds are going to your schools.
In some schools the number of pupil premium or free school meal eligible pupils is actually single digit numbers.
You cannot be proud of that and you and us at the Department for Education should want to do something about this.
Critics often point to a culture of intensive coaching that can put off those with the potential but not the means to pay, and this could be one reason for the low levels of pupils from disadvantaged backgrounds in grammar schools.
Proportionately, grammar schools have the lowest levels of FSM admissions in England.
Last year, 21 grammar schools had fewer than 1% of pupils eligible for free school meals.
Ninety-eight grammar schools had fewer than 3% of pupils eligible for free school meals, and nearly all grammar schools (161) had fewer than 10% of pupils eligible for free school meals.
That is compared to a national average of 16.3% across all secondary schools in England.
Too often the proportion of disadvantaged children entering grammar schools is out of step with their catchment areas. For example, in Buckinghamshire in 2011, 14% of the year 7 cohort across the county were eligible for the pupil premium. But only 4% of those admitted by grammar schools were eligible for the pupil premium.
In Lincolnshire, it was 21% across the county, compared to just 7% in grammar schools.
I accept of course that this discrepancy is not just confined to the selective sector.
Many top-performing, non-selective schools also fail to attract a fair proportion of pupils eligible for free school meals.
Two-thirds have a percentage of FSM pupils that is 5 percentage points or more below the local area average.
So in the same way I’m challenging you and working with you, I will also be looking at those schools to do what we can do to help pupils from disadvantaged backgrounds.
I recognise that these headline figures hide a more complex underlying picture.
I asked analysts in my department to undertake a more substantial piece of work to dig deeper into the data, so we could really understand why so few bright but poor children end up in grammar schools.
This work presented an interesting picture.
It showed that a key barrier is the low level of free school meal pupils achieving level 5, typically a proxy for pupils you admit. So this is not just a challenge for grammar schools, but for the whole education system.
In other words this is not just something that can be blamed on grammar schools. I totally accept that.
But I simply cannot and will not accept a system that fails poorer children in this way.
My promise to you, alongside my challenge to you, is that this government will do everything in its power to make sure that more children from poorer backgrounds achieve their full potential.
We have introduced the pupil premium - £2.5 billion this year alone - targeted at those pupils who need extra help.
This money is supporting primary schools, feeder schools in all your areas, to boost the attainment of disadvantaged pupils.
We have made it easier to identify high-achieving pupils from low income families by asking primary schools to monitor the academic progress of disadvantaged pupils in key stage 2 increasingly closely, with better data available through the RAISEonline system.
We are introducing free school meals for all infants, which in pilots raised attainment in English and maths, particularly for disadvantaged children.
And we have made the early years a top priority - extending free early education for all and giving 2-year-olds from lower income homes a free early years education for the first time ever.
Next year we are extending the pupil premium to disadvantaged early years children, while raising the primary pupil premium, skewing the budget to the age range that makes the most difference.
Finally, but crucially, we will not accept persistent weak performance and leadership in any school.
Schools in poor catchment areas often underperformed in the past, often for many years.
Now both the DfE and Ofsted will act swiftly to intervene in failing schools, so that they have the leadership and governance which they need.
Taken together, and over time, I believe that these crucial policies will start to shift the dial for poorer children - so that more and more reach level 5. There are already signs that the attainment gap is narrowing, particularly at key stage 2.
But what about those disadvantaged children who are academically able and do already achieve level 5?
In wholly selective areas fewer than half of pupils eligible for FSM achieving level 5 go into selective schools, compared with two-thirds of non- FSM pupils.
This cannot be right.
We calculated it would require a shift of just 200 level 5 FSM pupils to go into grammar schools in wholly selective areas to remove this particular bias - the failure to recruit pupils who should already be able to access your schools based on their attainment.
I was surprised that the number was so small, and actually so achievable.
Sadly, this speaks volumes of the work we need to do to secure better results in primary schools.
Your first, incredibly modest, job is to get these children into your schools. Over a decade, that would still be 2,000 more able pupils accessing some of the best schools in the country.
But, I think we would all acknowledge that aiming so modestly is not a satisfactory or inspiring ambition, and something neither you nor I are keen to do.
I want us to aim much higher than that.
My ambition is that all selective schools should aim for the same proportion of children on free school meals in their schools as in their local area.
This would mean an additional 3,500 free school meal pupils in selective schools every year, or an additional 35,000 pupils over 10 years.
There are likely to be many barriers in the way of this ambition and it is not something we can achieve overnight.
The problems range from parents not applying; pupils not revealing their full potential in the tests; local primary schools not considering your school as an option.
This presents a challenge to you and to us. I want us to be ambitious, I want to challenge the preconceptions about grammar schools and I want the sector to be able to show that it is responding to this challenge.
So we’ve talked about setting a longer-term ambition, but what can we do in the short term? This is something I have thought about a lot and forms part of the programme of work we have been doing jointly with the GSHA .
I am encouraged to see grammar schools leading the way in using the pupil premium as part of their admissions arrangements. This was a freedom set out in the 2012 Admissions Code and I am pleased to be able to say that 32 grammar schools have implemented an admissions priority for pupils eligible for free school meals this year.
This is a remarkable step and reflects a laudable commitment to putting the rhetoric around social inclusion into practical action.
In this area of pupil premium priority, your sector has been the leader.
I would like to thank the GSHA for working with us to support this move and encourage you all to think about whether this is something you could consider at your school.
We would like to see every grammar school adopt this approach.
There has been controversy recently about whether introducing a pupil premium admissions priority means you will automatically face an objection from the Office of the Schools Adjudicator.
Let me be clear. Anyone can object to the OSA , and you may face complaints.
There are people who will always resist change.
But as long as you have properly consulted on the changes and worked with the Education Funding Agency to make sure that the technical details in your funding agreement reflect this - then there is no case for schools to answer. The Admissions Code permits academies and free schools to give priority to pupils eligible for the pupil premium. And the recent determinations on this are clear on that point - these schools are lawfully permitted to prioritise pupil premium pupils.
We in the Department for Education will fully support any school that chooses to change its admissions criteria in this way - in fact, I want to see all grammar schools give preference to pupil premium pupils over the next few years.
But has the battle been lost before pupils even get to the point of admission? In some areas, a cottage industry has grown up offering coaching for entry to selective schools. Many children who have been “hot-housed” through coaching for grammar school entrance tests then struggle when they arrive because they have not acquired those independent learning skills that are crucial to further and higher education and the job market.
We all recognise that parents are passionate about getting their child in to a school that they think will best suit their child.
I don’t blame any individual parent or family for doing everything they can to help their individual child to get ahead. Doing your best for your child is a natural human instinct and one which we should commend and not criticise.
But these kind of coaching schemes put another barrier in the way of those children whose parents are unable or unwilling to pay for the additional coaching.
The GSHA is against coaching, not just because of access issues but because it can be a negative educational experience and the pressures this creates on children can outweigh any gains. So I really welcome the association’s work to encourage a move to entry tests that are less susceptible to coaching, and I am heartened to hear that at least 40% of grammar schools are now moving to the introduction of coaching resistant tests.
Again, I hope that all grammar schools will soon do so, and it will be interesting to see the impact of this.
The GSHA will be working with us, the Sutton Trust and the University of Durham to explore ways in which access to grammar schools by highly able deprived children might be improved by looking more closely at the testing process and what may be limiting the engagement of pupils with it.
I welcome that commitment.
Lastly, and probably most importantly, is the outreach work you do with your local primary schools and parents.
We can do what we can to raise attainment, make entrance tests more accessible and to give some priority in admissions - but unless parents and pupils see your school as suitable for them, then our efforts are wasted.
How many of you are partnered with your local primary schools, how many are engaging to identify those high-performing pupils who are not currently accessing your provision?
Well, I know some schools are doing great work.
Pates Grammar School in Gloucestershire has held awareness events in local schools for pupils, staff and parents, and many of the rest of you will be doing this.
High-performing local pupils have been invited into the school, to knock down the local perception that this is a school for ‘rich kids’. The school is increasingly seen as an aspiration for local families.
There is also great work taking place in the 5 Edward VI grammar schools in Birmingham.
These schools are working towards obtaining an intake of 20% from disadvantaged families.
They have introduced coaching resistant tests and are building close links with primaries to engage in a test familiarisation project. We at the Department for Education want to see more clusters of grammar schools engaging in projects like these and reaching out to the local community.
I want all schools to build on the progress that is being made and seek to close the gap by increasing parental engagement, and stronger working with local primaries - with a focus on identifying potential.
In conclusion I want to place on record my gratitude to those grammar school headteachers that have already initiated real changes.
I know that you are deeply committed to educational excellence and seeing disadvantaged children attend your schools, and flourish in them.
And I want to thank the GSHA for their engagement and work.
But we are starting from a very low base.
And it is no surprise that grammar schools are today often struggling to make their case for a big role in English education when one of the biggest claims once made, about social mobility, looks so hollow on the basis of the figures we are all aware of and which I cited early on.
We all recognise grammar schools need to return to their original mission and great aspiration of being engines of social mobility.
If you can do this then instead of being treated as a small corner of the educational debate, you will be entitled to make your case with confidence and persuasiveness.
For our part, government will leave no stone unturned in our mission to raise attainment, for all children, in primary schools.
We do not expect you to change the world by yourselves.
None of us in this room can be complacent in our goal.
We have begun the journey, but there is a long way to go.
Let us be ambitious about what we can achieve together, and continue with that joint commitment and determination to make the difference for all children.
Published: 19 June 2014


Assassins.TECH is a twist on the classic game Assassin using SMS text messaging.
Text NEW to +1 (647) 797-KILL to start a new game. Text HELP for help.
Go to Assassins.TECH/<6-digit game code>.html to check a game's leaderboards.
Assassins.TECH was built in 24 hours by Kyle Farwell and Jared Kelly for THacks 2, where it won second place. Read more on Devpost.
Built with the excellent JMP and jj.


I had taken ecstacy once before and had an amazing time so I decided to try it again. I was in the perfect place to do it. I was at my favorite outdoor concert venue, school had just ended, one of my favorite artists was performing, and I was with all my best friends. We all took our pills before the show started, and within about a half hour we were feeling the effects kick in.
My frineds seemed to be all having a good time and were excited for the effects to increase. I on the other hand started to get a feeling of ambivilence and physical weakness. I got kind of worried that I would not have the same roll that I did last time but I knew I had to keep a positive mindset. Afterall, i have found that my mental set has a large impact on my experience with drugs. Unfortunately, this did not help and I started to really get scared that something bad would happen to me.
My best knew I wasn't enjoying myself so she took me to a less crowded area and sat me down under a tree. All of a sudden something really bad happend to me. I felt overwhelmed with physical weakness; I was so hot, sweaty, shaking like it was -20 degrees outside, and so tired. Then I got really sad and the fact that I was missing the show made me even more upset.
Then I got very very frustrated. It seemed that my emotions would change every few minutes from sad to frustrated to scared. I was being very safe by drinking water and resting but this did not help. When i stood up I felt happy and I thought the bad part was over so I went back to the show, but two minutes later it went away.
This was all very exhausting. I do not know why this happened because 7 other people took the smae pill and had a great time. This goes to show that no matter what the circumstances are, there is still a chance of having a bad experience. Don't take the chance becaue even though rolls can be fun, it can be HORRIBLE!
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


{% extends "info_base.html" %} {% load crispy_forms_tags %} {% load i18n %} {% block content %}
Please enter your Puzzle Hunt CMU username and password:
Don't have an account? You can create an account here.
Forgot your password? You can reset your password here.


Your Google Contacts List
Listing the first 100 results of a standard query to
Google's Contacts API
Click here to clear your OAuth token


During my summer internship of 2017, I created a Meds Search Engine for a startup company called pulseData. The search engine looks up a drug name and returns its ingredients and known side effect. The tool is not available to the public since it is an internal company tool.
I used different technologies to accomplish my task. I used Flask framework for the backend with Python. For the front-end I used HTML, CSS, and Flask-Bootstrap. To access the data, I used MySQL and then I then I implemented Apache Solr for free text searches. Finally, I placed everything on a Docker container and then the project was pushed to Amazon Web Services.


A new user group is starting in Oklahoma City and it is one I find
completely fascinating… a Javascript group! With the monumental surge in popularity of Javascript over the past year or so, this type of group is a can’t miss.
Who should attend you might ask? All of us in the tech field because it is pretty much everywhere now.  Javascript is all over the web, going to be all over the desktop with Windows 8, appearing in the mobile markets, and starting to take over the back end with rad technologies like NodeJS.
I’m a complete noob with Javascript and I feel completely comfortable coming to this group because with as fast as this technology is moving, we’re all noobs and need to learn from each other. This group will not waste your time because
Learning is cumulative.
As a speed freak, my primary interest lies in NodeJS, but I know for a fact that I will learn something to help me with Node from Vance talking about BDD testing with a testing framework called Jasmine. That is just how it works. He gives, I take, and down the road I give back. Even if you don’t know or care a thing about Javascript, it can be a good networking opportunity with some of the people in our community that have a true passion for tech and are trying to push tech boundaries.  You have options.
If you don’t go or don’t plan to go…no worries. I’ll still love you (as a friend), but in our very fluid industry, dropping an hour a month of your time on something like this is an incredibly way to not go stagnant.
The first meeting is January 24th from 11:30-12:30 at the OKC CoCo. Come say hi and most importantly…. help me learn this stuff!
For more information, hit up http://okcjs.com/


asio Release Checklist
Update version number in configure.ac
Update version number and date in README
Generate a clean distribution by doing a `make maintainer-clean` followed by the steps necessary to do a `make dist'
Unpack/build/test distribution on Mac OS X using g++ 4.0 with adjacent boost directory
Unpack/build/test distribution on Linux using g++ 3.4 using the `--with-boost' configure option
Unpack/build/test distribution on Solaris using g++ 3.3 with adjacent boost directory
Unpack/build/test distribution using MSVC 7.1 with adjacent boost directory
Unpack/build/test distribution using bcc32 5.6.4 with adjacent boost directory
Unpack/build/test distribution using MinGW-4.1.0 with adjacent boost directory
Commit version number changes to CVS
Apply CVS tag of the form asio-x-y-z
Generate a clean distribution by doing a `make maintainer-clean` followed by the steps necessary to do a `make dist'


About Ping Pong
Created by:
Brian Mutai
Github Username
Brayonski
Level 2 Test For
JavaScript
Let's Play!
Rules:
Ping Pong will count up to the number from 1 the following exceptions:
- Numbers divisible by 3 are replaced with "ping"
- Numbers divisible by 5 are replaced with "pong"
- Numbers divisible by 15 are replaced with "pingpong"


Blogo¶
-
class
blogo.
Blogo
(name='Blogo')¶ A class which describes a turtle and has functions to move it in space.
-
add_cap
(is_start_cap, cs_name='')¶ Put in a cap in the shape of the current cross section, facing forwards or backwards
- Parameters
is_start_cap – If True then the cap will face backwards, otherwise forwards
-
add_end_cap
(cs_name='')¶ Put in a cap in the shape of the current cross section, facing forwards
-
add_follower
(turtle)¶ Add a follower turtle to this turtle.
Each action which causes a turn or a forward to the current turtle will also be made to the follower turtle
- Parameters
turtle (Blogo) – The turtle who should follow the current turtle.
-
add_gap
(name, start_height, end_height, widths1=('above', 'left', 'right'), widths2=('below', 'left', 'right'), gap_cs_shape='square', cs_splitting='')¶ Add a window in the middle of a cross section
The gap is made by squashing the original cross section to the bottom and adding in a new cross section above.
- Parameters
name – The name of the new cross section area
start_height – The height of the bottom of the gap
end_height – The height of the top of the gap
widths1 – The edges of the original cross section to copy into the new cross section (default (‘above’, ‘left’, ‘right’) - i.e. the new cross section goes at the top, with the same width)
widths2 – The edges of the original cross section to leave in the original cross section (default (‘below’, ‘left’, ‘right’) - i.e. the original cross section goes at the bottom, with the same width)
gap_cs_shape – Cross section shape to make the additional cross section (Default: ‘square’)
cs_splitting – The name of the cross section to split. (Default “”, i.e. the main cross section)
-
add_start_cap
(cs_name='')¶ Put in a cap in the shape of the current cross section, facing backwards
-
add_width_func
(name, func=None, cs_name='', **kwargs)¶ Add either a width function to a side
- Parameters
name – The side of the cross section to deal with. This can be a single side, (‘left’, ‘right’, ‘above’, ‘below’) or it can be a list of those sides or it can be a description of multiple sides (‘sides’, ‘verticals’, ‘all’)
func – The function to add, or None to remove all functions
kwargs – User data to pass on to the function when called
-
anticlockwise
(angle)¶ Rotate anti-clockwise by angle degrees
- Parameters
angle – Number of degrees to rotate anti-clockwise by
-
arc
(angle, radius, steps=None)¶ Move the turtle in an arc
The turtle will move in an arc round for angle degrees, with a given radius. If steps is specified the arc will be made up of that made straight sections.
- Parameters
angle – The interior angle of the arc in degrees. If this is positive the arc moves round to the right, otherwise to the left.
radius – The distance from the centre of the arc
steps – The number of straight lines to construct the arc from (default = angle)
-
backward
(dist)¶ Move the turtle backward by dist
Move the turtle backwards (or forwards if negative) by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
bk
(dist)¶ Move the turtle backward by dist
Move the turtle backwards (or forwards if negative) by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
circle
(radius, direction='right', steps=None)¶ Draw a circle with a given radius
- Parameters
radius – The radius of the circle.
direction – The side the circle should be draw on, “right” (default) or “left”
steps – The number of straight lines to draw the circle from. Default: 360
-
clean_up
()¶ Draw all outstanding Blogo instances
-
clockwise
(angle)¶ Rotate clockwise by angle degrees
- Parameters
angle – Number of degrees to rotate clockwise by
-
copy
(deep_copy=False, new_location=(0, 0, 0), relative_location=True)¶ Returns a copy of the current Blogo instance
- Parameters
deep_copy (bool) – If True then the existing Blender objects will be duplicated, if False the copy is still fairly deep, but no new objects
new_location (tuple) – The new location of the copy, either absolute or relative
relative_location (bool) – Indicates if new_location should be absolute or moved relative to the current turtle position
- Return type
-
copy_pos
(turtle)¶ Move the turtle and the orientation to the same as another turtle.
- Parameters
turtle (TurtlePosition) – The turtle to copy
-
curve_to
(end_position, end_direction, start_strength=1.0, end_strength=1.0)¶ Draw a cubic Bézier curve between the current position and then end position.
- Parameters
end_position (tuple) – The final position of the curve
end_direction (tuple) – A vector for the tangent at the end of the curve
start_strength (int, float) – The proportion of the curve which should be influenced by the start direction.
end_strength (int, float) – The proportion of the curve which should be influenced by the end direction.
-
dn
(angle)¶ Rotate downwards by angle degrees
- Parameters
angle – Number of degrees to rotate downwards by
-
down
(angle)¶ Rotate downwards by angle degrees
- Parameters
angle – Number of degrees to rotate downwards by
-
ellipse
(radius1, radius2, angle=360, steps=None)¶ Draw an ellipse starting at radius1 from the centre of the ellipse, curving to the extreme radius2 from the centre on the other axis and then looping round
- Parameters
radius1 – Distance from centre of ellipse to starting point
radius2 – Distance from centre of ellipse to the point on the ellipse at 90°
angle – Number of degrees to go round ellipse (default: complete ellipse)
steps – Number of straight lines to draw the ellipse from (default = angle)
-
fd
(dist)¶ Move the turtle forward by dist
Move the turtle forward (or backwards if negative) by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
fill
(from_value, to_value, texture, fill_type='relative')¶ Fill the current shape when either finished or the pen is put up.
The gap between the centre of the cross section and the limits from from_value to to_value is filled with the given texture. If fill_type is ‘relative’ then the limits with be a floating point value (generally between 0 and 1) where 0 is the lowest point on the cross section and 1 is the highest point. If the fill_type is ‘relative-reversed’ then it is the same as ‘relative’, but measured down from the top. If fill_type is ‘absolute’ then to_value and from_value refer to actual measurements from the base of the cross section. If fill_type is ‘absolute-reversed’ then to_value and from_value refer to actual measurements from the top of the cross section.
- Parameters
from_value – The bottom vertical position to fill from
to_value – The top vertical position to fill to
texture – The texture to fill with
fill_type – One of ‘relative’, ‘relative-reversed’, ‘absolute’, ‘absolute-reversed’
- Returns
A mesh object, which can be passed to fill_stop to stop filling.
-
fill_stop
(fill_mesh=None)¶ Remove either all or one single fill from the current turtle.
- Parameters
fillMesh – The mesh (returned by fill to remove, or if None then all fills will be removed (default None)
-
forward
(dist)¶ Move the turtle forward by dist
Move the turtle forward (or backwards if negative) by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
get_global_origin
()¶ Return the origin used by all instances of Blogo.
- Returns
Location of global origin
- Return type
tuple
-
get_heading
()¶ Returns the heading angle of the turtle, from 0 to 360 degrees.
- Returns
The heading of the turtle
-
get_length_counter
(name)¶ Get the length counter specified by name
- Parameters
name (string) – The name of the length counter to return
- Returns
None if the length counter does not exist, otherwise the value of the counter
-
get_objects
()¶ Return the blender objects for this turtle.
- Returns
A list of blender objects
-
get_origin
()¶ Return the origin used by this turtle.
- Returns
Location of local origin
- Return type
tuple
-
get_path_position
(pos, units='relative')¶ Get the position that the turtle was in a certain way along the current path.
This can be used to place other objects along the route that this turtle has taken.
- Parameters
pos – A distance along the current path
units – Either ‘relative’ for pos to be interpretted as the whole path between 0 and 1, or ‘absolute’ to give a distance along the path.
- Returns
A position and orientation of a turtle
- Return type
TurtlePosition
-
get_pos
()¶ Return the current turtle position
- Returns
Value of the current position
- Return type
tuple (x, y, z)
-
get_texture
()¶ Return the current texture used.
- Returns
The current texture
-
get_turtle
()¶ Return a copy of the current turtle position and orientation.
- Returns
A copy of the current turtle position
- Return type
TurtlePosition
-
get_v_heading
()¶ Returns the vertical heading of the turtle, from 0 to 360 degrees.
- Returns
The vertical heading of the turtle
-
get_width
(direction, cs_name='', loopCount=10)¶ Get the width modifier for a particular direction.
- Parameters
direction – One of ‘left’, ‘right’, ‘above’ or ‘below’
cs_name – The name of the cross section affected (default=””)
-
home
()¶ Return the turtle to the origin
-
join_objects
(union=False)¶ Join the underlying blender objects of this turtle into one object
- Parameters
union – If True the joined objects will be merged into one block with a binary operation, otherwise they will be separatable by using unjoin.
-
label
(name)¶ Insert a named label into the command history
- Parameters
name – The name to give the label - for reference in replay
-
left
(angle)¶ Turn left by angle degrees
- Parameters
angle – Number of degrees to turn left by
-
lt
(angle)¶ Turn left by angle degrees
- Parameters
angle – Number of degrees to turn left by
-
parse
(text, var=None, var_name='var')¶ This will parse a block of text and then execute it.
Any function used which is a member function in Blogo will be modified to run in the context of this turtle. Any brackets missing around member functions arguments will be added. Thus:
turtle.parse("fd 10; rt 90; fd 10; rt 90")
will be executed as:
turtle.fd(10) turtle.rt(90) turtle.fd(10) turtle.rt(90)
The argument var can be a dictionary used to pass in variables and have the code block read and modify them, with var_name specifying what name the dictionary is refered to by in the code block. e.g.:
data["size"] = 10 turtle.parse('fd data["size"];rt 90;fd data["size"]', data, "data")
Will move forward 10, turn right, then move forward 10 again.
Any valid python can be passed in to the code block, but could get fragile if too much code is passed in.
- Parameters
text – Block of code to parse
var – Dictionary to be able to get and set variables in code block
var_name – Name of the variable used to hold the dictionary in the code block
-
parse_file
(file, var=None, var_name='var')¶ Open a file and call parse with the contents of the file
- Parameters
file – Name of file containing a block of code to parse
var – Dictionary to be able to get and set variables in code block
var_name – Name of the variable used to hold the dictionary in the code block
-
pd
()¶ Put the pen down.
Putting the pen down means that a trail will be left behind the turtle in the shape of the current cross section.
-
pen_down
()¶ Put the pen down.
Putting the pen down means that a trail will be left behind the turtle in the shape of the current cross section.
-
pen_up
()¶ Put the pen up.
Putting the pen up means that a trail will not be left behind the turtle.
-
polygon
(sides, lengths, angles=None)¶ Draw a polygon with a given number of sides.
Draws a polygon. If the number of lengths or angles given is equal to the number of sides, then the polygon may not be closed
- Parameters
sides – The number of sides the polygon should have
lengths – Either an int/float giving the length of every side, or a list of the lengths of each side
angles – If given then either an int/float giving every angle, or a list of the angles after each side.
-
pu
()¶ Put the pen up.
Putting the pen up means that a trail will not be left behind the turtle.
-
rectangle
(length1, length2)¶ Draws a rectangle
- Parameters
length1 – The length of the first and third sides
length2 – The length of the second and fourth sides
-
remove_follower
(turtle)¶ Remove a follower turtle that has been added with add_follower
- Parameters
turtle (Blogo) – The turtle who should not follow the current turtle.
-
remove_gap
(name)¶ Remove a gap that has been previously added by`add_gap`
- Parameters
name – The name of the gap to remove
-
remove_width_func
(name, func, remove_all=True)¶ Remove either a specific width function from a side, or remove all width functions from that side.
- Parameters
name – The side of the cross section to deal with. This can be a single side, (‘left’, ‘right’, ‘above’, ‘below’) or it can be a list of those sides or it can be a description of multiple sides (‘sides’, ‘verticals’, ‘all’)
func – The function to remove, or None to remove all functions
remove_all – If True then if a function has been added more than once then all will be removed, otherwise only the first occurance will be. (default: True)
-
replay
(turtle, from_label='start', to_label='end', allowed_command_types='all')¶ Replay a number of commands from this turtle in another turtle’s context
- Parameters
turtle –
from_label –
to_label –
allowed_command_types –
-
reset
(init=False)¶ Return the turtle to the origin and remove all modifiers
-
reset_cross_section
()¶ Reset the cross section to a square
-
reset_length_counter
(name, include_bk=- 1, include_pu=False, value=0.0)¶ Reset a value used by a length counter
Sets the given length counter to value, specifies how backward movements should be treated, and whether the counter should be increased when the pen is up.
- Parameters
name (string) – The name of the length counter to reset
include_bk (int) – 0 to ignore backwards movements, 1 to include backwards movements, -1 to subtract backwards movements
include_pu (bool) – True to increase the counter when the pen is up, False to leave the counter when the pen is up
value (int, float) – The value to reset the counter to.
-
reset_multipliers
(cs_name=None)¶ Reset width multipliers to 1
-
right
(angle)¶ Turn right by angle degrees
- Parameters
angle – Number of degrees to turn right by
-
rt
(angle)¶ Turn right by angle degrees
- Parameters
angle – Number of degrees to turn right by
-
set_alpha
(alpha)¶ Set the alpha (transparency) value for the current texture.
If a texture is a rgba colour tuple, then this value will be multiplied by the tuple alpha value.
- Parameters
alpha – A value between 0 (completely transparent) and 1 (completely opaque) to set the texture alpha to
-
set_cross_section
(shape, multiplier_h=1.0, multiplier_v=None, name='')¶ Set the cross section shape of the current turtle.
The shape can either be a list of two dimensional points or one of ‘square’ or ‘circleN’, where N is an integer specifying how many points the circle should be made up of (just ‘circle’ will use a value of N=100).
A ‘square’ cross section will create a unit square from (-0.5, -0.5) to (0.5, 0.5)
- Parameters
shape – Either a list of points or ‘square’, ‘circle’, ‘circle10’, ‘circle500’, etc
multiplier_h – A multiplier to multiply the left and right by (default: 1.0)
multiplier_v – A multiplier to multiply the top and bottom by. If None it will use the same value as multiplier_h (default: None)
name – The name of the cross section to change
-
set_fill_smart_project
(smart_project)¶ Sets whether the fill texture should be smart projected.
Some textured Blogo shapes look better with smart project on, but it will take longer to create the objects.
- Parameters
smart_project – True or False depending on whether to smart project the fill texture or not.
-
set_fill_texture_scale
(texture_scale)¶ Set the texture scale of the current fill.
When using a image as a fill texture this will scale the image. A value of 0 will give an attempt to scale the image proportionally to the size of the object. Any other number will scale the image by that amount. A value of None will leave the scale as Blender’s default.
- Parameters
texture_scale – The scale factor to use, or 0 for auto.
-
set_fill_unwrap
(unwrap)¶ Sets whether the mesh should be unwrapped before applying the texture to the current fill.
Some textured Blogo shapes look better with unwrapping on, but it will take longer to create the objects.
- Parameters
unwrap – True or False depending on whether to unwrap the object before applying the fill texture or not.
-
set_global_origin
(origin_y=0, origin_z=0)¶ Change the origin used by all instances of Blogo.
- Parameters
origin (tuple, int, float) – Either a tuple containing the origin’s location or the x location
origin_y (int, float) – y coordinate of the origin (defaults to either 0 or value given in origin if tuple)
origin_z (int, float) – z coordinate of the origin (defaults to either 0 or value given in origin if tuple)
-
set_heading
(angle)¶ Set the heading angle of the turtle, from 0 to 360 degrees.
- Parameters
angle – The new heading, 0 - 360 or ‘north’, ‘east’, ‘south’, ‘west’
-
set_heading_towards
(coord)¶ Set the heading to be towards the given coordinate
- Parameters
coord – A tuple giving a position
-
set_heading_vec
(vec)¶ Set the heading to be the same as the given vector
- Parameters
vec – A tuple giving a vector
-
set_height
(name, value=1.0, cs_name='')¶ Set one or more of the width modifiers to a named value.
If only a number parameter is supplied then it will set both above and below to that multiplier.
- Parameters
name – The name or names of the sides to set, or a value to set above and below to if a number
value – The value to set the modifier to. The cross section distance from the middle is multiplied by this value
cs_name – The name of the cross section affected (default=””)
-
set_length_incr
(incr, incr_mul=None)¶ Set how often any width functions should be called when moving forwards or backwards.
The incr value gives a maximum distance to move before recalculating the width. The incr_mul value gives the maximum proportion of the line to move before recalculating. For example, incr=0.1 and incr_mul=0.01 will mean that to draw a line 8 long, incr says width must be recalculated every 0.1, but incr_mul says it must be done every 0.08, therefore the forward will be done in steps of 0.08. To draw a line 80 long, incr says it must be done in steps of 0.1, but incr_mul says the steps should be no longer than 0.8 - therefore the forward will be done in steps of 0.1
If either incr or incr_mul are None then their values will not be changed.
- Parameters
incr – An absolute maximum length of step before recalulating the width of the line.
incr_mul – A maximum length of step before recalulating the width of the line, relative to the length of the line
-
set_origin
(origin=0, origin_y=0, origin_z=0)¶ Change the origin used by this turtle.
- Parameters
origin (tuple, int, float) – Either a tuple containing the origin’s location or the x location
origin_y (int, float) – y coordinate of the origin (defaults to either 0 or value given in origin if tuple)
origin_z (int, float) – z coordinate of the origin (defaults to either 0 or value given in origin if tuple)
-
set_pos
(position, move_type='absolutely-relative')¶ Set the position of the turtle.
If any values in the position tuple are left out or set to None then the current position in that axis will be kept.
- Parameters
position (tuple) – A tuple of the position to move to
move_type – One of ‘absolute’ (move to that location), ‘relative’ (move by that much) or ‘absolutely-relative’ (move to that position, but any followers should move by the relative equivalent)
-
set_smart_project
(smart_project)¶ Sets whether the texture should be smart projected.
Some textured Blogo shapes look better with smart project on, but it will take longer to create the objects.
- Parameters
smart_project – True or False depending on whether to smart project the texture or not.
-
set_texture
(texture)¶ Set a new texture for the cross section to be drawn covered in.
The texture can be a tuple of rgb colours (each in range 0 -> 1), or a named colour or an image filename.
- Parameters
texture – The texture to use.
-
set_texture_scale
(texture_scale)¶ Set the texture scale.
When using a image as a texture this will scale the image. A value of 0 will give an attempt to scale the image proportionally to the size of the object. Any other number will scale the image by that amount. A value of None will leave the scale as Blender’s default.
- Parameters
texture_scale – The scale factor to use, or 0 for auto.
-
set_turtle
(turtle)¶ Set the turtle position to a copy of turtle
- Parameters
turtle (TurtlePosition) – The turtle to copy
-
set_unwrap
(unwrap)¶ Sets whether the mesh should be unwrapped before applying the texture.
Some textured Blogo shapes look better with unwrapping on, but it will take longer to create the objects.
- Parameters
unwrap – True or False depending on whether to unwrap the object before applying the texture or not.
-
set_v_heading
(angle)¶ Set the heading of the turtle, from 0 to 360 degrees.
- Parameters
angle – The new vertical heading, 0 - 360 or ‘up’, ‘backward’, ‘down’, ‘forward’
-
set_v_heading_towards
(coord)¶ Set the heading to be towards the given coordinate
- Parameters
coord – A tuple giving a position
-
set_v_heading_vec
(vec)¶ Set the heading to be the same as the given vector
- Parameters
vec – A tuple giving a vector
-
set_width
(name, value=1.0, cs_name='')¶ Set one or more of the width modifiers to a named value.
If only a number parameter is supplied then it will set both left and right to that multiplier.
- Parameters
name – The name or names of the sides to set, or a value to set left and right to if a number
value – The value to set the modifier to. The cross section distance from the middle is multiplied by this value
cs_name – The name of the cross section affected (default=””)
-
set_x
(x)¶ Set the x axis position of the turtle
- Parameters
x – The position to set the turtle on the x axis
-
set_xy
(x, y)¶ Set the position of the turtle without changing the z axis position
- Parameters
x – The position to set the turtle on the x axis
y – The position to set the turtle on the y axis
-
set_xyz
(x, y, z)¶ Set the position of the turtle.
- Parameters
x – The position to set the turtle on the x axis
y – The position to set the turtle on the y axis
z – The position to set the turtle on the z axis
-
set_xz
(x, z)¶ Set the position of the turtle without changing the y axis position
- Parameters
x – The position to set the turtle on the x axis
z – The position to set the turtle on the z axis
-
set_y
(y)¶ Set the y axis position of the turtle
- Parameters
y – The position to set the turtle on the y axis
-
set_yz
(y, z)¶ Set the position of the turtle without changing the x axis position
- Parameters
y – The position to set the turtle on the y axis
z – The position to set the turtle on the z axis
-
set_z
(z)¶ Set the z axis position of the turtle
- Parameters
z – The position to set the turtle on the z axis
-
square
(length)¶ Draws a polygon with four equal sides
- Parameters
length – The length of the sides.
-
strafe
(dist)¶ Move the turtle sideways by dist
Move the turtle sideways by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
strafe_v
(dist)¶ Move the turtle upwards by dist
Move the turtle upwards (or down if negative) by dist. If the pen is down it will trail behind it defined by the current cross section and width modifiers.
- Parameters
dist (int, float) – Distance to move
-
tilt_h
(angle)¶ Tilt the cross section in the horizontal axis by angle degrees
- Parameters
angle – Number of degrees to tilt horizontally by
-
tilt_r
(angle)¶ Roll the cross section by angle degrees
- Parameters
angle – Number of degrees to roll by
-
tilt_v
(angle)¶ Tilt the cross section in the vertical axis by angle degrees
- Parameters
angle – Number of degrees to tilt vertically by
-
triangle
(length, angles=None)¶ Draw a three sided polygon.
- Parameters
length – Either an int/float giving the length for an equilateral triangle, or a list giving the length of the sides.
angles – If not given then a closed triangle will be drawn from the given lengths, otherwise an int/float or list of angles (triangle may not be closed)
-
up
(angle)¶ Rotate upwards by angle degrees
- Parameters
angle – Number of degrees to rotate upwards by
-


title = "services" url = "/services" layout = "static-layout" is_hidden = 0 ==
{{ serData.services_desc | raw }}


As a leading mobile games developer, Jam City is looking to “level up” our talent. We’re on the hunt for innovators who consider themselves dynamic, collaborative, and thrive in a fast-paced environment.
PERKS & BENEFITS
Unlimited Vacation, Paid Sick Days & Holidays
100% Employee Covered Medical, Dental, Vision Plan Base Plan
Life Insurance, 401k, Flexible Spending Accounts, Commuter Benefits & More
Catered Lunches & Well-stocked Kitchens
Yoga & Wellness Activities
Happy Hours
Company Events
Dog Friendly
ABOUT THE ROLE
The Data Analyst works with Product Managers to produce actionable insights from player behavior data. You will collaborate with Data Scientists, Analysts and Product Managers across the company to support live operations that continuously improve engagement and monetization. We are looking for a creative, analytical mind that combines quantitative rigor with deep understanding of what makes mobile games great.
ABOUT JAM CITY
Jam City is an award-winning mobile entertainment studio providing unique and deeply engaging games that appeal to a broad, global audience.
Led by CEO Chris DeWolfe, former MySpace co-founder and CEO, and COO Josh Yguado, former 20th Century Fox executive, Jam City is the creative powerhouse behind some of the highest-grossing and most enduring mobile games. Jam City’s global franchise Cookie Jam has generated more than half a billion dollars, and Panda Pop has more than 120 million downloads to date.
The company also is the go-to studio for Hollywood, having developed immersive, narrative-rich mobile games around iconic entertainment brands. The company’s popular RPG game Harry Potter: Hogwarts Mystery was the #1 game in more than 40 countries at its launch in April 2018.
Jam City has nine studios located in Los Angeles (HQ), Berlin, Buenos Aires, Bogotá, Burbank, Cedar Falls, San Diego, San Francisco, and Toronto.


[dscrdeql] <Jellysmash> In fact I ate left overs today
[dscrdeql] <Jellysmash> Probably will tomorrow as well
[dscrdeql] <adriana> cant sleep
[dscrdeql] <adriana> im gonna die today
[dscrdeql] <adriana> ;' )
[dscrdeql] <adriana> but at least i started to watch this one show on netflix with debbie ryan ?
[dscrdeql] <AndronicusBass-Founder> Ive never been the best with crackling but trying again and following instructions. dried with paper towel and now resting it in the fridge with salt
GatewayBOT20-Aug-18 08:09 AM
[dscrdeql] <Adrian >
[dscrdeql] <Jellysmash> yea, that's it...dry it down...rub olive oil into it and then rub salt into it and sprinkle more on top
[dscrdeql] <Jellysmash> morning @Adrian
[dscrdeql] <Jellysmash> looks like I leveled up
[dscrdeql] <Jellysmash> nice
[dscrdeql] <shah1305> Morning all
[dscrdeql] <Adrian > Well i get up 6 hours ago... now i finish a meeting
[dscrdeql] <Adrian > But 10x
[dscrdeql] <Adrian > And congrats
[dscrdeql] <Jellysmash> thanks
[dscrdeql] <Jellysmash> oh...time for mid meeting coffee then
[dscrdeql] <Jellysmash> I quite often take my mobile into meeting
[dscrdeql] <Adrian > Neah... beer time :Amusing:
[dscrdeql] <Jellysmash> if it's boring then I might chat a bit on mobile
[dscrdeql] <Jellysmash> hahaha...beer time it is
[dscrdeql] <Adrian > Yeap
[dscrdeql] <Adrian >
[dscrdeql] <Adrian > I deserved
[dscrdeql] <Adrian > :Celebration:
[dscrdeql] <Jellysmash>
[dscrdeql] <Adrian > Cheers
[dscrdeql] <Jellysmash> chink those beer glasses together
[dscrdeql] <Jellysmash> thanks...cheers
[dscrdeql] <Adrian > U with
[dscrdeql] <Adrian > ?
[dscrdeql] <Adrian > I suppose
[dscrdeql] <Jellysmash> I'll see when it's closer to dinner time
[dscrdeql] <Jellysmash> I just got home from work
[dscrdeql] <Adrian > Welcome home
[dscrdeql] <Jellysmash> finally can use discord with a proper keyboar
[dscrdeql] <Adrian > May i say
[dscrdeql] <Jellysmash> keyboard
[dscrdeql] <Jellysmash> haha...thanks
[dscrdeql] <Jellysmash> yes...good to get home
[dscrdeql] <Jellysmash> it's freezing in sydney today
[dscrdeql] <Jellysmash> very cold winter wind
[dscrdeql] <Jellysmash> rode home freezing
[dscrdeql] <Adrian > Is 30 degree here...
[dscrdeql] <Jellysmash> you lucky bugger
[dscrdeql] <Jellysmash> that's awesome
[dscrdeql] <Adrian > Friday was 37
[dscrdeql] <Jellysmash> wish it was 30 here
[dscrdeql] <Adrian > Hehe is summer
[dscrdeql] <Jellysmash> that's pretty hot ./...37
[dscrdeql] <Jellysmash> raise a sweat with that
[dscrdeql] <Adrian > On Christmas u will have 30 degrer
[dscrdeql] <Jellysmash> Yes, probably will
[dscrdeql] <Adrian > Yeap
[dscrdeql] <Jellysmash> I sweat a bucket in summer doing weights downstairs outside
[dscrdeql] <Jellysmash> even though it's early in the morning
[dscrdeql] <Jellysmash> at least don't have it like that at the moment
[dscrdeql] <Adrian > Hehe... goood for u....
[dscrdeql] <Adrian > On September i'll start again to go to gym...
[dscrdeql] <Adrian > Untill then ...
[dscrdeql] <Adrian > Weights lost by walking
[dscrdeql] <adriana> morning
[dscrdeql] <adriana> adrian owo
[dscrdeql] <Jonathan-Mod> Morning @adriana
[dscrdeql] <adriana> i just polished up a logo i made a while back
[dscrdeql] <adriana> for my new project
[dscrdeql] <Jonathan-Mod> Dang where you guys at that it's that cold? it 70 here in the states at 4:20 am lol
[dscrdeql] <adriana> its called pos (property of society)
[dscrdeql] <adriana> its 9am here
[dscrdeql] <adriana> uk
[dscrdeql] <adriana> i havent slept tho
[dscrdeql] <Adrian > Hey @adriana
[dscrdeql] <Jonathan-Mod> me neither @adriana - sleep has been hard for me lately.....your project sounds interesting
[dscrdeql] <adriana> its gonna be clothing brand
[dscrdeql] <adriana> handmade by myself in local company that does printing etc


Tacos
Tacos types
Al pastor
Al pastor (from Spanish, "shepherd style"), also known as tacos al pastor, is a dish developed in Central Mexico that is based on shawarma spit-grilled meat brought by the Lebanese immigrants to Mexico.
Carnitas
Carnitas, literally meaning "little meats", is a dish of Mexican cuisine originating from the state of Michoacán. Carnitas are made by braising or simmering pork in oil or preferably lard until tender. The process takes three to four hours, and the result is very tender and juicy meat, which is then typically served with chopped coriander leaves (cilantro) and diced onion, salsa, guacamole, tortillas, and refried beans (frijoles refritos).
Carne Asada
Carne asada (literally "flesh/meat/beef" "roast/broiled/grilled") is a Latin American dish of grilled and sliced beef, usually sirloin steak, tenderloin steak or rib steak. It is usually cooked with a certain amount of searing to impart a charred flavor. Carne asada can be served as a main dish or as an ingredient in other dishes. The term carne asada translates to "grilled meat"; the English "roast beef" is so named in Spanish.
Fish tacos
Tacos de pescado ("fish tacos") originated in Baja California in Mexico, where they consist of grilled or fried fish, lettuce or cabbage, pico de gallo, and a sour cream or citrus/mayonnaise sauce, all placed on top of a corn or flour tortilla. In the United States, they were first popularized by the Rubio's fast-food chain, and remain most popular in California, Colorado, and Washington. In California, they are often found at street vendors, and a regional variation is to serve them with cabbage and coleslaw dressing on top.


JSON class library for Java 1.4. Code adapted from JSON.org implementations. @version 1.1 @author HMS Networks, MU Americas Solution Center


static val RecycleListView: IntArray
static val RecycleListView: IntArray
Attributes that can be used with a RecycleListView.
Includes the following attributes:
AttributeDescriptioncom.hexanovate.familytree:paddingBottomNoButtons
com.hexanovate.familytree:paddingTopNoTitle
See Also
#RecycleListView_paddingBottomNoButtons#RecycleListView_paddingTopNoTitle


$KMD #KOMODO
Lovely chart here.
Potential triple bottom.
Strong bullish divergences & volume accumulation.
Upwards potential is mainly the orange zone if you'd swingtrading this one.
One of the best projects out there.
house28-Aug-18 03:06 PM
somehow I don't think we'll care by then Satinder (edited)


U·NA·GI \oo-na-gee\v. a total state of awareness!
As true UNAGI enthusiasts, We've decided to it's time for us to PIVOT quickly! If you want to get all the BRAND NEW INFORMATION, just sign up below!
Subscribe to Our Newsletter!
Trust us we hate spamming,
you will get delightful emails


KyberNetwork is a new system which allows the exchange and conversion of digital assets.
We provide rich payment APIs and a new contract wallet that allow anyone to seamlessly receive payments from any token.
Users can also mitigate the risks of price fluctuations in the cryptocurrency world with our derivative trading.
Every operation happens on the smart contract. No trust is required. We never hold users' funds.
We maintain a reserve of all tokens to provide high liquidity. Get your tokens instantly when you trade.
No waiting for confirmations, no deposit required. Instantly get your tokens once your transaction is included in the blockchain!
Compatible with existing smart contracts. No changes are needed to integrate with KyberNetwork.
Convert and exchange your tokens securely, instantly.
Pay to anyone in any token from your own token. We'll do the conversion and forward the payment seamlessly.
Get your dividends from a DAO soon and worry about the price fluctuation? Hedge with us.
Receive payments from Bitcoin and other cryptocurrencies in Ether.
Loi Luu is a researcher working on cryptocurrencies, smart contract security and distributed consensus algorithms.
He is also a regular invited speaker at Bitcoin and Ethereum workshops
such as DevCon2, EDCON
Loi believes in the force of the Ethereum and Blockchain technology. Much of his work revolves around this community. He developed Oyente, the first open-source security analyzer for Ethereum smart contracts. Loi also cofounded SmartPool, another open source project which embraces decentralization of mining pools in existing cryptocurrency. He continues to champion decentralisation and trustless properties of the Blockchain with KyberNetwork, taking inspiration and developing value for the community.
Yaron Velner holds a PhD in computer science from Tel Aviv University. His research is focused on game theory incentives in blockchain protocols and formal verification of smart contracts. He has found several bugs in the Ethereum bug bounty program.
Yaron is also an experienced software developer with over 10 years as a senior software engineer and a technical leader at EZchip semi-conductors. He was a member in the data structure and algorithm team, which developed novel data structures for IP routing.
Victor Tran is a senior backend engineer and Linux system administrator. He has experience in developing large-scale infrastructures for multiple social marketing platforms and advertising networks. He is interested in building high performance multi-platform applications. Victor has been involved in blockchain and cryptocurrency development since early 2016 and is a lead engineer at the SmartPool project.
Wong Lee Hong career spans across various industries over 3 decades. He has extensive distribution and business development experience in consumer electronic, multimedia, computer gaming, Internet and the banking sectors. The second half of his career was spent developing the Internet Banking capability of a major financial institution, venture capital activities in strategic startups and regulatory management role, dealing with banking regulators in Asia in matters relating to banking technology and operations. At present, he is a Blockchain enthusiast and investor.
Vitalik is the Founder and Chief Scientist of Ethereum. He is also both the Founder and a writer for Bitcoin Magazine, a venture that marked the beginning of his career in cryptocurrency in 2011. He is interested in creating secure, efficient, and trustworthy systems and advises a number of projects in the cryptocurrency space.
Leng Hoe Lon co-founded Shentilium with National University of Singapore, with the aim of using the latest data-driven technology to drive business decisions and gain competitive edge. He also co-founded TrackRecord Asia, with the vision that anyone can learn to trade in the financial markets profitably within a professional risk management framework. Prior to this, he held various positions in the financial industry including Deutsche bank (London and Singapore), JPMorgan (Singapore), ABN Amro (Singapore). He was a Managing Director in Goldman Sachs’ Asia Macro Trading group in HK and Asian FX trader in London. He was also CEO of Tudor Capital Singapore, a global macro hedge fund.
Chye Kit is the co-founder and Managing Director of Cynopsis Solutions, a Software-as-a-Service (Saas) company that specializes in regulatory, control and governance, anti-money laundering (AML) and counter terrorism financing (CTF) solutions to customers. To date, Cynopsis Solutions has served over 250 clients worldwide, including Kyber Network. Prior to being an entrepreneur, Chye Kit spent about 15 years in the financial sector, notably as a Managing Director and Joint Regional Head of Compliance at Macquarie Group for Asia.
Kenneth is a practising lawyer and Senior Partner with Dentons Rodyk & Davidson’s Corporate Practice, and China/Indonesia Practices. Kenneth specializes in corporate finance, with almost two decades worth of experience in venture capital, private equity, IPOs/ICOs and post-IPO/ICO funding, as well as mergers and acquisitions. Kenneth is admired for his quickness of mind and has been widely regarded as one of the most creative lawyers in his area of interest.
Prateek Saxena is a research professor in computer science at National University of Singapore. He works on blockchains and computer security. His research has influenced the design of browser platforms, web standards and app stores widely used today. He has received several premier awards such as the MIT TR35 Asia.
Founder of LinkTime, Organizer of several Ethereum workshops. Community Relations, Crypto-Business Advisor in China.
Our token sale was over.
Our exchange platform is first to provide on-chain, trustless and instant trades with high liquidity. For more information, please refer to our whitepaper.
Bancor uses a fixed formula to determine the price of the token, while KyberNetwork lets the reserve managers determine the price. To become a reserve manager at KyberNetwork, user needs to register with and be approved by the operator.
0x utilizes offline channels to match makers and takers, but KyberNetwork matches and processes the order on-chain immediately. 0x's approach is to bring the order book off-chain and then execute the settlement on-chain. On the other hand, KyberNetwork's main proposition is to support on-chain and instant trades with guaranteed liquidity.
The MVP is out
The next generation of decentralized exchange and on-chain payment service When Ethereum was first introduced, many people had anticipated that it would become the mammoth it is today. At the time of writing, the market capitalization of Ethereum...
read moreKyberNetwork’s long term vision is to support trading between different cryptocurrencies, e.g between BTC and ETH, ETC and any ETH tokens. In order to do so, we rely on technology and protocols that allow communication...
read moreOur first meetup in Singapore on July 21st was a successful event, attaining a handsome attendance of over 100 people. It was an fulfilling session, thanks to the participation of enthusiastic audience. Through a series of Q&As...
read more


My CSCI - 571 Homework
Link to Homework #1
Link to Homework #2
Link to Homework #3
Link to Homework #4
Link to Homework #5
Link to Homework #6
Link to Homework #7
Link to Homework #8
Link to Homework #9
Link to Homework #10


'The time is right for me to step away' - Limerick All-Ireland winner retires after 11 years
30 and out: Paul Browne has called time on his inter-county career.
by Emma DuffyLIMERICK ALL-IRELAND WINNER Paul Browne has called time on his inter-county career after 11 years.
Browne announced the news with a statement on the Limerick GAA website last night, noting that “the time is right” to step away.
The Bruff midfielder was part of John Kiely’s Treaty squad that ended a 45-year wait for Liam MacCarthy glory in 2018 — though he missed out on action through injury.
Vice-captain in their All-Ireland winning season, a devastating cruciate injury ruled him out for much of the season.
30-year-old Browne made his championship debut in 2009, and departs the Limerick set-up with two Munster medals (2013 and 2019), Division 1 title — also from the season gone by — and a Division 2 honour from 2011.
Browne’s statement, in full, reads:
“I have decided that the time is right for me to step away form the Limerick Senior Hurling Panel after eleven seasons involved.
“I would like to thank my club Bruff Gaa, fellow club colleagues, coaches and mentors for their support. I hope to repay that support over the coming years. To the teachers and staff in Scoil Dean Cussen and FCJ Bruff I am extremely grateful for their encouragement in my younger years.
“I would like to thank my employers LIT who have been very accommodating since I commenced my employment there.
“Over the course of my playing career I went through several surgical procedures and I would like to thank the Limerick County Board and Senior Medical Team of Mark Van Drumpt, Mark Melbourne and Dr James Ryan for the care I received.
I leave with nothing but wonderful memories and pride from my eleven years playing with Limerick. To have shared the dressing room with all my past team-mates and this incredible panel of players now has been the greatest honour of my life.
“I look forward to supporting the 2020 Panel and Management and I would urge all Limerick supporters to do so,” Browne added. “There are fantastic times ahead.
“I would like to thank my family and in particular my girlfriend Niamh for their unwavering support and sacrifice during my career.”
Limerick GAA noted: “We wish Paul all the best after 11 years of service with Limerick GAA. Thanks for the memories Brownie.”


Introduction¶
This tutorial describes the process of analyzing bibliographic information using techMiner.
The library can be installed using:
!pip3 install techminer
directly in a Jupyter notebook.
For creating a worldmap plot the computer must have installed GeoPandas.
For the appropiate use of the library, the user must have a basic knowledge of:
Python.
Matplotlib.
Pandas.
Seaborn (optional for some plots).
Altair (optional for some plots).
Please refer to the documentation of these tools in case of any doubt.


[gecode-users] Thread-safe space copying
Christian Schulte
cschulte at kth.se
Fri May 29 13:58:18 CEST 2009
Hi,
No operation in Gecode is thread safe (by design). So, when you want to
create a clone of a space, only one thread can do that at a time (and you
have make sure that clone is called with false as argument for share). If
that turns out to be a bottleneck for your application: if you have created
an unshared clone c from a space s, then of course two threads can create
clones in parallel: one from c and one from s.
Christian
From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
Of Jérémie Vautard
Sent: Friday, May 29, 2009 1:46 PM
To: gecode list
Subject: [gecode-users] Thread-safe space copying
Hi all,
I have several threads that might clone a same Gecode::Space object at the
same time. Is the Space.clone(...) method thread safe, or should I ensure
that it is never concurently called ?
Cheers,
--
Jérémie Vautard
Doctorant/Ph-D Student
LIFO - Laboratoire d'Informatique Fondamentale d'Orléans
Batiment IIIA
Rue Léonard de Vinci
B.P. 6759
F-45067 ORLEANS Cedex 2
Tel: (+33) 02 38 49 48 57
Cell: (+33) 06 65 11 51 7(
http://www.univ-orleans.fr/lifo/Membres/vautard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ps.uni-sb.de/pipermail/users/attachments/20090529/16f89688/attachment.htm>
More information about the gecode-users
mailing list


CRUD AngularJS
Add/Edit
Customer Name
Email
Customer Name
Email
Operations
{{ customer.customerName }}
{{ customer.email }}
Edit
|
Delete


| Exported Interfaces - Details |
::com::sun::star::lang::XInitialization
- Description
- used to initialize the component when instantiating.
In the ::com::sun::star::lang::XInitialization::initialize method, you can
pass a ::com::sun::star::lang::Locale to specify the default locale of the
number formats supplier.
The component should be initialized only once, after it has been instantiated, and before it
has been used.
If you initialize it a second time (or after you used it), it is up to implementation
how this is handled.
|
|
XNumberFormatsSupplier
- Description
- allows access to the number formats supplied by the component.
|
|
Top of Page
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


2.3.5. Create a Batch registration Function Using Upload¶
This section describes the function to upload a CSV file for batch registration based on an example application.
- Description of the function to be created
- Click “Project batch registration (プロジェクト一括登録)” in the header menu.
Download the batch registration sample file which generates the validation error from below
batch_project_registration_validation_error.csv
(プロジェクト一括登録_バリデーションエラー.csv)Upload the sample file and click the “Register(登録)” button.
- Validation error occurs.
- Download the batch registration sample file which does not generate validation error from below
project_batch_registration.csv
(プロジェクト一括登録.csv)- Upload the sample file and click the “Register(登録)” button.
- The contents of the file are registered in the database and the completion message is displayed.
<IP_ADDRESS>. Overview of the business action method to be created¶
- ProjectUploadAction.java
@OnDoubleSubmission @OnError(type = ApplicationException.class, path = "/WEB-INF/view/projectUpload/create.jsp") public HttpResponse upload(HttpRequest request, ExecutionContext context) { // Acquire upload file List<PartInfo> partInfoList = request.getPart("uploadFile"); if (partInfoList.isEmpty()) { throw new ApplicationException( MessageUtil.createMessage(MessageLevel.ERROR, "errors.upload")); } PartInfo partInfo = partInfoList.get(0); LoginUserPrincipal userContext = SessionUtil.get(context, "userContext"); // Loading and validation of upload files List<Project> projects = readFileAndValidate(partInfo, userContext); // Batch registration to DB insertProjects(projects); // Add a completion message context.setRequestScopedVar("uploadProjectSize", projects.size()); // Saving a file saveFile(partInfo); return new HttpResponse("/WEB-INF/view/projectUpload/create.jsp"); }The processing flow of the business action method is as follows.
- Acquire a file
- Validate the contents of the CSV file by binding to Bean
- Batch registration to DB
- Saving a file
The details of each process is described under Implementation of the file upload function and Implementation of the batch registration function.
<IP_ADDRESS>. Implementation of the file upload function¶
First, how to create the upload part of the batch registration function using upload is explained
- Create a file upload screen
Create a screen with a file upload field.
- /src/main/webapp/WEB-INF/view/projectUpload/create.jsp
<n:form useToken="true" enctype="multipart/form-data">
  <c:if test="${not empty uploadProjectSize}">

<n:message messageId="success.upload.project" option0="${uploadProjectSize}" />

 </c:if>  <n:errors errorCss="message-error"/>

Project information file selection

 Project information file selection

 Project information file

 <n:file name="uploadFile" id="uploadFile"/>

 <n:button uri="/action/projectUpload/upload" allowDoubleSubmission="false" cssClass="btn btn-raised btn-default">Registration</n:button>

 </n:form>- Key points of this implementation
- Specify multipart/form-data as enctype attribute of form tag to send multipart file.
- Create a file upload field using file tag. Specify the registration name of the request object in the name attribute. To acquire the file in a business action, specify this registration name as an argument of HttpRequest#getPart
- Display upload completed message with message tag, once the upload is completed. In order to include the number of uploads in the completion message, specify the number of uploads configured in the request scope in option0 attribute.
- Use errors tag to create an area to display the list of validation error messages for the target file. For the output format of the error message list, refer to error message list.
- Create a business action method
Describes how to get and save a file in the business action method.
- ProjectUploadAction.java
public HttpResponse upload(HttpRequest request, ExecutionContext context) throws IOException { List<PartInfo> partInfoList = request.getPart("uploadFile"); if (partInfoList.isEmpty()) { throw new ApplicationException(MessageUtil.createMessage(MessageLevel.ERROR, "errors.upload")); } PartInfo partInfo = partInfoList.get(0); // Batch registration process is omitted as it will be described later // Saving a file saveFile(partInfo); return new HttpResponse("/WEB-INF/view/projectUpload/create.jsp"); } /** * Save a file * * @param partInfo Upload file information */ private void saveFile(final PartInfo partInfo) { String fileName = generateUniqueFileName(partInfo.getFileName()); UploadHelper helper = new UploadHelper(partInfo); helper.moveFileTo("uploadFiles", fileName); }- Key points of this implementation
Acquire the file HttpRequest#getPart.
When the file does not exist (not uploaded), then the size of PartInfo list that is acquired will be zero. This value is used to perform control such as throwing a business exception.
The uploaded file is stored in a temporary area by the multipart request handler. Since the temporary area is automatically deleted, if you need to permanently (save) an uploaded file, move the file to an arbitrary directory. However, file transfers are possible only when the file path management is used to manage the input and output of files and directories.
Use UploadHelper#moveFileTo method to transfer files. The first argument is the key name of the file storage directory registered in the configuration file. In the Example Application, the configuration is described in the following file.
- filepath-for-webui.xml
 <component name="filePathSetting" class="nablarch.core.util.FilePathSetting" autowireType="None"> <property name="basePathSettings"> <map>   <entry key="uploadFiles" value="file:./work/input" /> </map> </property>  </component>
<IP_ADDRESS>. Implementation of the batch registration function¶
This section describes how to create the batch registration part of the batch registration function using uploads.
- Create a bean to bind the contents of the file
A bean to bind the contents of the file is created.
- ProjectUploadDto.java
@Csv(headers = { /** Describe the header **/}, properties = { /** Properties to bind **/}, type = Csv.CsvType.CUSTOM) @CsvFormat(charset = "Shift_JIS", fieldSeparator = ',',ignoreEmptyLine = true, lineSeparator = "\r\n", quote = '"', quoteMode = CsvDataBindConfig.QuoteMode.NORMAL, requiredHeader = true) public class ProjectUploadDto implements Serializable { // Excerpt of some items only.Getter and setter are omitted /** Project name */ @Required(message = "{nablarch.core.validation.ee.Required.upload}") @Domain("projectName") private String projectName; /** Project type */ @Required(message = "{nablarch.core.validation.ee.Required.upload}") @Domain("projectType") private String projectType; // Property that holds the line count to process.Setter is omitted. /** Line count*/ private Long lineNumber; /** * Get line count. * @return Line count */ @LineNumber public Long getLineNumber() { return lineNumber; } }
- Key points of this implementation
- Use @Csv for configuration to link the contents of the uploaded CSV file with the bean property. Use @CsvFormat to specify the acceptable CSV format. （ @CsvFormat is not required when using the default format specification） For information on how to configure the annotation, refer to format specification method when binding the CSV file to the Java Beans class.
- Perform Bean Validation by assigning annotations for validation of @Required and @Domain to the property.
- To accept the values from a file, property is defined as string type, and conversion to an appropriate type is performed as per the safe value that has passed the validation.
- By defining the line count property and granting LineNumber to the getter, the line of the target data can be configured automatically.
Tip
The validation error message of a required input item is changed to an appropriate value as per the file upload. For information on how to specify a validation message, refer to configure the input value check rule.
- Create a business action method
Create a business action method to register the contents of the uploaded file in the database.
- Validate the contents of 1 CSV file by binding to Bean
- ProjectUploadAction.java
private List<Project> readFileAndValidate(final PartInfo partInfo, final LoginUserPrincipal userContext) { List<Message> messages = new ArrayList<>(); List<Project> projects = new ArrayList<>(); // Validate the contents of the file by binding it to the bean try (final ObjectMapper<ProjectUploadDto> mapper = ObjectMapperFactory.create( ProjectUploadDto.class, partInfo.getInputStream())) { ProjectUploadDto projectUploadDto; while ((projectUploadDto = mapper.read()) != null) { // Validate and configure the result messages messages.addAll(validate(projectUploadDto)); // Create an entity projects.add(createProject(projectUploadDto, userContext.getUserId())); } } catch (InvalidDataFormatException e) { // Parsing ends if there is an invalid line in the file format messages.add( MessageUtil.createMessage( MessageLevel.ERROR, "errors.upload.format", e.getLineNumber())); } // Not registered in the database even if there is one error if (!messages.isEmpty()) { throw new ApplicationException(messages); } return projects; } /** * Validate the project information and store the result in the message list. * * @param projectUploadDto Project information Bean generated from CSV * @return messages List of validation result messages */ private List<Message> validate(final ProjectUploadDto projectUploadDto) { List<Message> messages = new ArrayList<>(); // Single item validation.Execute Bean validation based on the annotation defined in Dto try { ValidatorUtil.validate(projectUploadDto); } catch (ApplicationException e) { messages.addAll(e.getMessages() .stream() .map(message -> MessageUtil.createMessage(MessageLevel.ERROR, "errors.upload.validate", projectUploadDto.getLineNumber(), message)) .collect(Collectors.toList())); } // Customer existence check if (!existsClient(projectUploadDto)) { messages.add(MessageUtil.createMessage(MessageLevel.ERROR, "errors.upload.client", projectUploadDto.getLineNumber())); } return messages; }
- Key points of this implementation
- Use ObjectMapper provided by DataBind to bind and get the file to the bean.
- By executing ObjectMapper#read for the acquired ObjectMapper object, the list of bound bean can be obtained.
- Validator object can be created by using ValidatorUtil#getValidator, and Bean Validation can be executed for any Bean.
- When verification is continued up to the last row and not aborted even when an error occurs, error messages for all rows are stored after the verification is completed in Message list, by generating and throwing ApplicationException with this list as an argument, it can be output to the screen with errors tag.
- For how to assign a property name to the validation message, implement by referring to how to include item names in the message when a validation error occurs.
- 2.Batch registration to DB
- ProjectUploadAction.java
public HttpResponse upload(HttpRequest request,ExecutionContext context) throws IOException { // Execution of validation is described above // Batch registration to DB insertProjects(projects); // Saving a file is described above } /** * Register multiple project entities to the database in a batch. * @param projects List of validated projects */ private void insertProjects(List<Project> projects) { List<Project> insertProjects = new ArrayList<Project>(); for (Project project : projects) { insertProjects.add(project); // Batch insert every 100 records if (insertProjects.size() >= 100) { UniversalDao.batchInsert(insertProjects); insertProjects.clear(); } } if (!insertProjects.isEmpty()) { UniversalDao.batchInsert(insertProjects); } }
- Key points of this implementation
- Batch registration is executed using UniversalDao#batchInsert.
- Set an upper limit on the number of registrations per batch registration, because a large number of registrations at a time may result in a deterioration in performance.
This completes the explanation for the batch registration function using upload.