WP Logger
WP Logger Guide
Description
WP Logger helps you keep track of your crop and guides you with the necessary treatment to achieve its potential yield .
Data Logging: The application will record and make it easy to share your collected data. You will be able to locate your measures on the field providing points to collect your data and make decisions.
Data Visualization: get your measurements on a map to understand the variability on your fields.
Irrigation Assessment: crops that are on the application will assist in irrigation pattern and schedules.
Use
The application saves measurements, location, and weather data, temperature and humidity. With these values is possible to calculate the ideal value for the Stem Water Potential measure of a plant measure under those temperature and humidity values.
These measures can be used to decide whether or not the plants need to be watered.
The user chooses to create a new Session Logging.
The application shows a Logging View. In this view the user can choose the crop and temperature and humidity. The user can annotate the value measured with the pressure chamber.
On the view there is a button “Next”, which creates a new Logging View and a button “Done” which finishes the Session Logging showing next the Detail View
On the Detail View the user can see the averaged values for Stem water Potential, ideal Stem Water potential, temperature, and humidity.
There is a “Crop” Button, “Measures” Button and a “Map” Button
Pressing on “Crop” Button the user will be able to choose another crop with those measurements
“Measures” Button shows the number of measurements on the button’s title as “XXX measurements” pressing on it will show the Measures List View
“Map” Button will bring the Map view on the screen
Measures List show the list saved for a given Session, It will be TableView sorted by time pressing on them will bring a detail view of the measure as a Logging View but with the fields completed, and no “Done” Button.
The view will show the “Next” Button where the user can add more measures to an existing session
The user can edit the values after a prompt is shown with a message instructing on the none reversal effects of changes.
Map view will show the location of the measurements overlapped a map. The view will also show the session title, and pressing on the overlapped icon the user will be able to see the values measured, ideal, temperature and humidity


{% extends "_base.html" %} {% block title %} - Sorry!{% endblock %} {% block content %}
You are not allowed here. Move along.


by Shivangi|27 Sept 2020
Just like we’ve grown accustomed to living in compartments stacked directly on top and beside each other so too are lettuce and herbs.
Yes, you heard it right agriculture will be going vertical soon. Why? Because it saves water,increases efficiency and provides us with fresh, local produce.
At this point of time it might seem like an insignificant shift, unlikely to produce much effect, but considering the fact that by 2050 the world's population is expected to grow by another 2 billion people and at that point of time feeding everyone would be extremely challenging.Therefore vertical farming could be an effective solution to overcome such issues in the future.
So what is vertical farming?
Vertical farming is the practice of producing food on upright surfaces. Instead of farming in a field, vertical farming grows plants stacked in layers, in structures like shipping containers or warehouses.
Assembled layer by layer under candy-colored lights, vertical farming has become an increasingly popular way for food producers to reduce costs related to space and energy consumption while increasing growth rates and nutrient values.
Of the many companies that are testing out this innovative farming method, Most recent is IoT company n.thing's Planty Cube,
Planty Cube is a smart hydroponic vertical farm that relies on data from farming logs, which are fed back into a database called the “Cube Cloud" and analyzed with AI to help farmers determine optimal growing conditions. As the user adds more Planty Cubes to the vertical farm, this real time, cloud-based system makes it easier for the grower to manage the overall farm, even remotely.
More on Planty Cube
Agriculture IoT startup n.thing developed Planty Cube, a vertical farm with technology to cultivate high-quality vegetables in a fully controlled environment that can increase production.
With the Planty Cube, clients can start a vertical farming business with a smaller number of units and expand as the business grows. To increase the size of their farm, clients can include more cubes as needed as their business grows gradually, compared to traditional warehouse vertical farms that have high initial costs.
The smart hydroponic farm, shaped like a shipping container, is made of stacked rows and shelves of planters on each wall. After seeds are sown through their smart seed capsules, a computerized system controls the environment in the Planty Cube and helps the plants thrive without constant human attention.
Co-Founder and CEO of n.thing Leo Kim said his inspiration for Planty products came from developing an IOT smart pot where users can check real-time information about their plants through sensors.
The Tech Behind It
With special LED lights and internet-connected sensors, Planty Cube allows year-round farming with consistent quality and no price fluctuation.
The system for Planty Cube controls the cultivation environment, such as temperature, humidity and prevention of pests, by creating a sealed environment. The LEDs that are used also have the right mixture of light to help the photosynthesis of the plants.
Data collection is the driving force behind Planty Cube. The system collects the farming logs into a database and can provide the optimal water and other growth information for each crop. Data is sent to the CUBE Cloud, which manages the schedule of a farm in each region and can provide production orders and alarms for each farm, allowing easy farm management.
The Planty Cube operating system allows users to maintain the farm at any time and from anywhere, maximizing the ease of cultivation.
Because the Planty Cube allows complete control of the environment and nutrients for the plants, it’s also able to produce specialty vegetables, such as greens with low nitrate and low potassium for consumers who suffer from kidney diseases or heart disease.
From hotels and restaurants to schools and retail, those who need a steady supply of food are now able to start thinking about their own year-round supply of fresh vegetables with Planty Cube.
To demonstrate its potential, n.thing has developed a smart hydroponic farm that uses the planty cube design. shaped like a shipping container, it is made of stacked rows and shelves of planters on each wall with each pickcell roughly two inches in width, length, and depth. after seeds are sown through their smart seed capsules, a computerized system controls the environment by monitoring plant health and adjusting the LEDs, temperature and humidity, accordingly. the planty cube system, which uses sensors to collect data on the plants, can also be controlled via a smartphone, presenting the unique opportunity to farm remotely.
Unlike glasshouse production, which relies on sunlight, vertical farming makes use of led lighting to provide different wavelengths of light, according to crop and growth stage need. these high-tech units are being presented as the solution to many of the challenges facing traditional production methods, such as pollution and water use.
Visual explaination of how planty cube works
https://www.youtube.com/watch?time_continue=69&v=-CImF-h6-bM&feature=emb_logo
Indoor Gardening
https://www.youtube.com/watch?time_continue=47&v=KL2kTAUUOQA&feature=emb_logo
Did you like it?


Try typing something in each input. See that the model only updates when you blur off the input.
Now see what happens if you start typing then press the Escape key
With $rollbackViewValue()
Without $rollbackViewValue()


Holla
Amigos!
This is just a website for my projects
Nothing interesting. Please go away, or stay....whatever...


ISE Student at NIE, Mysuru
I try my best to solve problems on CodeChef, LeetCodes, HackerRank etc.
Currently learning web development and aim to be a full-stack web dev. Currently knowing only HTML,CSS, Vanilla JS.Learning MERN Stack.
If you love pokemons as much as i do, or maybe wanna talk about any competitive programming question, feel free to send me a message


Timed actions work using the <n-presentation/> element time system. This system allows developers to fire off actions at a given time, in seconds from route entry.
You should see a console log message after 3 seconds.


Soft Computing for Machine Learning and Bioinformatics, Verilog Dr. Muller Publication, Mau- ritius, Germany, June 2010.
Feature selection in High dimensional data using meta-heuristic, H. Banka & Suresh Dara, Lam- bert Acad. Pub., 2017
Proceedings of the Third IEEE International Conference on Recent Advances in Information Technology, Vol. I & Vol. II (IEEE Conference) Dr. C. Kumar & Dr. H. Banka Vol. I- 582 (pages), Vol. II- 581(pages), Cygnus, India, March, 2012.
Proceedings of the First IEEE International Conference on Recent Advances in Information Tech- nology, Vol. I & Vol. II, Dr. C. Kumar & Dr. H. Banka and D. Ramesh, Vol. I- & Vol. II IEEE X-Plore, India, March, 2016.
1. S. Mitra, H. Banka and W. Pedrycz, \Rough-fuzzy collaborative clustering", IEEE Transactions on Systems, Man, and Cybernetics, Part B: 36, (3) 2006.
2. Sushmita Mitra, Haider Banka: Multi-objective evolutionary biclustering of gene expres- sion data. Pattern Recognition 39(12): 2464-2477, 2006
3. Mohua Banerjee, Sushmita Mitra, Haider Banka: Evolutionary Rough Feature Selection in Gene Expression Data. IEEE Transactions on Systems, Man, and Cybernetics, Part C 37(4): 622-632, 2007.
4. Sushmita Mitra, Haider Banka: Application of Rough Sets in Pattern Recognition. Transactions on Rough Sets, 151-169 (2007).
5. S. Mitra, R. Das, H. Banka, and S. Mukherjee, \Gene Interaction: An Evolutionary Biclustering Approach, Information Fusion, vol. 10, pp 242- 249, 2009.
6. Kaushik, Baijnath, and Haider Banka. \Performance evaluation of approximated artifi- cial neural network (AANN) algorithm for reliability improvement." Applied Soft Com- puting 26, 303-314, 2015.
7. Haider Banka, and Suresh Dara. \A Hamming distance based binary particle swarm optimization (HDBPSO) algorithm for high dimensional feature selection, classification and validation." Pattern Recognition Letters, 52, 94-100, 2015.
8. P. CH Srinivas, H. Banka, Energy Efficient Clustering Algorithms for Wireless Sensor Net- works: Novel Chemical Reaction Optimization Approach, Wireless Networks (WINE), 2015.
9. Haider Banka, Santosh Kr. Ray and D. C. Panigrahi, \Standardization of a method for studying susceptibility of Indian coals to self-heating, Arabian Journal of Geosciences, 2016.
10. P. CH Srinivas, H. Banka, \Novel Chemical Reaction Optimization based Unequal Cluster- ing and Routing Algorithms for Wireless Sensor Networks, Wireless Networks (WINE), 2016.
11. Rao, P. C. Srinivasa, P K Jana, and Banka, H., A particle swarm optimization based energy efficient cluster head selection algorithm for wireless sensor networks, Wireless Networks, 2016.
12. Mohammad Nadeem, Haider Banka, R. Venugopal,\SVM-based predictive modelling of wet pelletization using experimental and GA-based synthetic data, Arabian Journal for Science and Engineering, 2016
13. Rohit Kumar Yadav, Haider Banka, \An Improved Chemical Reaction Based Approach for Multiple Sequence Alignment Indian Acad Science, Current Science, (Thomson Reuter), 2016
14. Mohammad Nadeem, Haider Banka, R. Venugopal, \A neural network-based approach for steady-state modelling and simulation of continuous balling process, Soft Computing, 2016, (Springer)
15. Singh, Jayraj, A. K. Verma, Haider Banka, T. N. Singh, and Sachin Maheshwar.\A study of soft computing models for prediction of longitudinal wave velocity." Arabian Journal of Geosciences, no. 3 (2016): 224.
16. Nadeem, Mohammad, Haider Banka, and R. Venugopal. \Estimation of pellet size and strength of limestone and manganese concentrate using soft computing techniques." Ap- plied Soft Computing, 59 (2017): 500-511.
17. Lalwani, Praveen, Haider Banka, and Chiranjeev Kumar. "CRWO: Clustering and routing in wireless sensor networks using optics inspired optimization." Peer-to-Peer Network- ing and Applications, no. 3 (2017): 453-471.
18. Jaiswal, Abeg Kumar, and Haider Banka. \Local transformed features for epileptic seizure detection in EEG signal." Journal of Medical and Biological Engineering, (2017): 1-14.
19. Jaiswal, Abeg Kumar, and Haider Banka. \Local pattern transformation based fea- ture extraction techniques for classification of epileptic EEG signals." Biomedical Signal Processing and Control, 34 (2017): 81-92
20. Sahoo, Tapan Kumar, and Haider Banka.\New hybrid PCA-based facial age estima- tion using inter-age group variation-based hierarchical classifier." Arabian Journal for Science and Engineering, 42, no. 8 (2017): 3337-3355.
21. Lalwani, Praveen, Haider Banka, and Chiranjeev Kumar. "BERA: a biogeography-based energy saving routing architecture for wireless sensor networks."Soft Computing , 22 no. 5 (2018): 1651-1667.
22. Lalwani, Praveen, Sagnik Das, Haider Banka, and Chiranjeev Kumar. "CRHS: cluster- ing and routing in wireless sensor networks using harmony search algorithm." Neural Computing and Applications, 30 no. 2 (2018): 639-659.
23. Jaiswal, Abeg Kumar, and Haider Banka. \Epileptic seizure detection in EEG signal using machine learning techniques." Australasian physical & engineering sciences in medicine, 41, no. 1 (2018): 81-94.
24. Singh, J., Banka H.. and Verma, A.K. \A BBO-based algorithm for slope stability analysis by locating critical failure surface. Neural Computing and Applications,(2018) pp.1- 18.
25. Huda, R.K. and Banka H. \Efficient feature selection and classification algorithm based on PSO and rough sets.Neural Computing and Applications,(2018) pp.1-17.
26. Sahoo, T.K. and Banka H. \Multi-feature-Based Facial Age Estimation Using an Incom- plete Facial Aging Database.Arabian Journal for Science and Engineering, pp.1-22, 2018
27. Pradhan, Jitesh, Arup Kumar Pal, and Haider Banka. \Principal texture direction based block level image reordering and use of color edge features for application of object based image retrieval." Multimedia Tools and Applications, (2018): 1-33.


Green Chicken Chili
I derived this recipe from combining a couple of recipes:
- https://simpleasthatblog.com/instant-pot-green-chicken-chili/
- https://www.allrecipes.com/recipe/263617/chef-johns-green-chicken-chili/
We didn’t have chipotle powder on hand, so I used paprika as a substitute, and skipped the chile powder that was also mentioned to keep the heat down. I’d describe it as not spicy for anyone who normally enjoys spicy foods, and mild for those who are sensitive to it. If you want to make it spicy, using spicier green salsas, keeping the jalapeño seeds, or using more/different peppers can all do that.
This recipe can easily be adopted to a slow cooker or stove top pot as well, but using an Instant Pot or pressure cooker will minimize prep time.
*When buying green salsa, look at the ingredients. The first ingredient should be tomatillos, and the next two should be onion and green chiles (but not necesssarily in that order). Herdez is a pretty good brand, and you can buy canned to keep over time, or fresh salsa if you’re able.
Use as much cilantro as you’re comfortable with. We love it, so putting in a whole bunch isn’t out of the question, as you can see in the image.
Alternative to dicing everything, you can put it all in a blender as well.

Yields: 8
Preparation time: 30
Cooking time: 30
Ingredients
-
2-3 pounds of boneless chicken breasts (or equivalent amount of thighs)1 medium onion diced2-4 cloves of garlic1 large jalapeño pepper, seeded and sliced1 teaspoon cumin1 teaspoon dried oregano1 teaspoon kosher salt1 teaspoon paprika1/2 to 1 teaspoon of ground black pepper2 15 oz. cans of white kidney (aka cannellini) beans, drained and rinsed.15 oz can (or about 2 cups) of chicken broth24-28 oz. of green salsa (salsa verde)*4 oz. can of chopped or diced green chiles (preferably Hatch)1/4 to 1 bunch of cilantro leaves and stems, choppedShredded cheddar cheese for servingSour cream for servingTorilla chips for serving
Directions
-
Preheat Instant Pot with sauté function.If using chicken breasts, add some cooking oil, and brown in the Instant Pot. If using thighs, they’ll have enough fat and oil shoudn’t be needed.Once browned, add everything except for the cilantro, and serving garnishes to the Instant Pot. Set to the Poultry setting, or 15 minutes on high pressure. More time may be needed if your breasts are completely frozen. 15 minutes was enough time for two partially defrosted breasts for us.Once the Instant Pot has completed the pressure cycle, either perform a quick release, or allow for a natural release.Taste, and add more salt as needed. Stir in the diced cilantro, and allow to keep warm for 5-10 minutes.Serve in bowls over tortilla chips, and topped with a dollop of sour cream and cheddar cheese, as desired.
Category: Entree
Cuisine: Texmex


Guidance
Types of apprenticeships that you can apply for in the creative and digital media sector.
This apprenticeship covers starting roles in a range of sectors, including digital, television, archive, animation, interactive media, film, photo imaging and radio.
You’ll develop an understanding of the end-to-end production cycle in relation to different platforms, eg audio, visual, interactive and emerging technologies and post production. You could work in different genres like entertainment, drama, news and sport, and in different formats such as live, studio and online.
You and your employer will be able to tailor your apprenticeship programme, selecting a combination of options.
There are 2 types of creative and digital media apprenticeships.
You could train in roles like:
Higher level apprenticeship You’ll take on more specialised roles like:
You can become an apprentice in England if you’re:
If you took your GCSEs more than 5 years ago and didn’t gain a top grade (A or A*), or you don’t have good GCSE grades in maths and English, you’ll need to take a literacy and numeracy test.
Published: 12 April 2012


{% extends 'base.html' %} {% block main %} You most closely resemble: {{ name }} Other cast Another photo {% endblock %}


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object eu.cassandra.sim.entities.Entity eu.cassandra.sim.entities.appliances.ConsumptionModel
public class ConsumptionModel
Class for storing the variables of a consumption model. It has no functionality except parsing a JSON string and return the values on demand.
| Constructor Summary | |
|---|---|
ConsumptionModel()
Instantiates a new consumption model. |
|
ConsumptionModel(int outerN,
int[] n,
java.util.ArrayList<Tripplet>[] patterns)
Instantiates a new consumption model with the parameters provided. |
|
ConsumptionModel(java.lang.String amodel,
java.lang.String type)
Instantiates a new consumption model, by parsing a JSON string |
| Method Summary | |
|---|---|
boolean |
checkStatic()
Check if consumption is static. |
java.lang.Double[] |
getConsumption()
Gets the consumption. |
int |
getN(int i)
Gets the number of times that the i-th pattern runs. |
int |
getOuterN()
Gets how many times the patterns repeats. |
java.util.ArrayList<Tripplet> |
getPattern(int i)
Gets the i-th pattern. |
int |
getPatternDuration(int i)
Gets the i-th pattern's duration. |
int |
getPatternN()
Gets the number of patterns. |
java.util.ArrayList<Tripplet>[] |
getPatterns()
Gets the array storing the consumption patterns. |
int |
getTotalDuration()
Gets the total duration of the consumption model. |
com.mongodb.BasicDBObject |
toDBObject()
Gets the consumption model as a BasicDBObject. |
| Methods inherited from class eu.cassandra.sim.entities.Entity |
|---|
getDescription, getId, getName, getType, setDescription, setId, setName, setType |
| Methods inherited from class java.lang.Object |
|---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public ConsumptionModel()
public ConsumptionModel(java.lang.String amodel, java.lang.String type) throws java.lang.Exception
amodel
- the JSON stringtype
- the type of the consumption model ("p" or "q" for active or reactive power, respectively)
java.lang.Exception
- the exceptionpublic ConsumptionModel(int outerN, int[] n, java.util.ArrayList<Tripplet>[] patterns)
outerN
- how many times the patterns repeatsn
- how many times each pattern runspatterns
- the patterns as active/reactive power value - duration - slope tripplets| Method Detail |
|---|
public int getTotalDuration()
public int getOuterN()
public int getPatternN()
public int getN(int i)
i
- the index i
public int getPatternDuration(int i)
i
- the index i
public java.util.ArrayList<Tripplet> getPattern(int i)
i
- the index i
public java.util.ArrayList<Tripplet>[] getPatterns()
public boolean checkStatic()
public java.lang.Double[] getConsumption()
public com.mongodb.BasicDBObject toDBObject()
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


{{< layout}}
{{$pageTitle}}{{/pageTitle}}
{{$content}}
{{< hmpo-partials-form}}
{{$form}}
Application reference: PEX 319 825 680X Your payment: £102.86, reference: IE19852 Email confirmation sent to {{values.email}} Application submitted
We can't start your application until we receive your old passport.
It's best to use a strong C5 envelope (one that fits A5 documents). You don’t need to include a covering letter.
HM Passport Office
Ref: PEX 319 825 680X
Aragon Court
Northminster Road
Peterborough
PE1 1QG
You can use standard post or a secure service.
If you have questions contact contact HM Passport Office(Opens in a new window)
Give feedback


A Blog on the Role of Gender in Information Technology
Takeaway Journal and Career Plan
Now presenting, the takeaway journal, in which I droll along about what I learned in this course whilst simultaneously displaying mildly relevant images.
Information Technology Project—TexTrade
Imagine an efficient mobile platform for peer-to-peer textbook exchanges. A tool that saves you money compared to the University BookStore and time compared to Facebook exchange groups. Introducing TexTrade, setting a new precedent in textbook trading now.
Role Model Presentation—Women in Tech
Ada Lovelace is recognized by many as the first computer programmer for working with inventor Charles Babbage on what is now considered the first prototype of a modern computer, the Analytical Engine. To this day, she continues to be a role model to women in tech.
Reading Reflections
In this course, we were assigned to read articles about the topics discussed in class. These are my reflections on the articles about diversity in team, the pay gap between men and women, and keeping women employed in technical fields.
Reading Reflection #1 - October 31, 2016
Reading Reflection #2 - November 9, 2016
Reading Reflection #3 - November 16, 2016
Cool Fact!
I should confess that I rushed to my Cool Fact/Stat because it sounded so odd to begin with. By the time I presented my cool fact/stat, I realized that it was not appropriate for the course. Nevertheless, I covered a joke programming language called C+= or "C Plus Equality". It was created by a group of satirists who exaggerated feminist stereotypes in a negative light.


Create Record
Borrower
Agreement Date
Client Description
CLTA Role(s)
Legal counsel
Description of documents
Original / CTC
No. of copies
Doc Receipt Date
Location
Remarks
Record Created. Document ID is
Print


Test DateTextBox Widget with _BidiSupport
Test NumberSpinner Widget with _BidiSupport
Try typing values, and use the up/down arrow keys and/or the arrow push buttons
Test CurrencyTextBox Widget with _BidiSupport
Test TimeTextBox Widget with _BidiSupport


OpenUrl Coronavirus CrossRef analysis gene CoVdb Abstract Science FREE Text sequence genome protein Virol Web coronavirus database new Bioinformatics Res alignment genomes genomic information strains genes virus >; CoVdb. Figure S). global high multiple phylogenetic population proteins regions structure subcellular Acids Genome Nucleic coronaviruses data did general genetics novel respiratory tree using (Figure Coronavirus. DNA Data Gen browser colored data. developed evolutionary group identity knowledge localization located main parameters possible prediction previous provide resource selection


1.) What is the nullish coalescing operator?
a) ??
b) ||
c) &&
d) **
Answer key: ??
2.) Which of these is the OR operator?
a) ??
b) ||
c) &&
d) **
Answer key: ||
3.) What would be the output of this script?
let
mystery = n => n * 4;
alert
( mystery(3) );
8
4
18
12
Answer key: 12
4.) What would be the output of this script?
let
sum = (a, b) => {
let
result = a + b;
};
alert
( sum(1, 2) );
2
6
3
4
Answer key: 3
5.) What would be the output of this script?
let
x = (1 && 2) ?? 3;
alert
(x);
1
2
3
6
Answer key: 2
6.) What would be the output of this script if 18 was entered?
let
age =
prompt
("What is your age?", 18);
let
welcome = (age < 18) ?
() =>
alert
('Hello') :
() =>
alert
('Greetings!");
welcome();
Hello
Greetings
Syntax Error
Hello & Greetings
Answer key: Greetings


The Site Info tool provides
information about the current site. This tool's primary purpose is to
allow site managers to update the site's settings and membership.
For site participants
If you have limited permissions, you'll see the site's description and
your group memberships, if applicable.
For site managers
The functions of the Site
Info tool are also available through the Worksite Setup
tool, which is available on the menubar when you are in
My Workspace.
Tip: If the warning
"Unpublished site" appears above the site menu, the site is invisible to
participants. Once you publish the site,
your participants will be able to see it as a tab or find it in the list of
active sites.
Help documentation
For help documentation about Site
Info, see Site Info.


{% extends 'base.html' %} {% block content %}
The Users API provides information about the users in the system. In order to use this API you must log in. Information on this process is found below.
An example request might look like:
GET /user HTTP/1.0
Host: test.com
X-Session: 13066b17bbd780d5384a54830c5594e0ba6fc9e2282a08bec17ec6893b593202
X-Signature: 79202a7b8e8e068d331417867bab9b4cdc7f277acae42779982c02688ecb4d94
[... Additional paramaters for the request go here ...]
Endpoint:POST /login
Requires Authentication: No
Required Parameters:
username
password
{
"success": true,
"message": "You have successfully registered. You can now use your account."
}
Please note: unless your user has "admin" level access, you will only receive your own information from this endpoint.
Endpoint:GET /users
Requires Authentication: Yes
Required Parameters: None
Example Success Response:
{
"users": [
{ ... }
]
}


About Emily is a full-time software engineer and part-time aspiring artist. She doesn’t believe in imposter syndrome.


SteemPlus the most powerful toolbox for Steem
If you were using Chrome browser you must be very familiar with the Steem More Info extension that extending useful features on the steemit.com, this extension was once the reason why I can stand so long with the ugly and unfriendly steemit interface.
Now we have a stronger plugin available developed by @steem-plus which not only included all the features by the Steem More Info but introducing a lot more practical yet fun functions.
You can now add the SteemPlus via Chrome web store. Not sure if they supporting other browsers but I would definitely recommend you to try this out if you are on Chrome.
Image from @steem-plus
Fun features – User Classification
To me the most outstanding feature is the User Classification. You can tell all the accounts that you are interacting is either a Human, Spammer, or Bot. All the username will now have such tag beside in the feed, comment or replies page. But the plugin algorithm might not be perfect as I can see some of my friends are classified as Spammer while I don’t think he is one. Yet this is funny, haha!
More intuitive profile banner
A new badge on the left stating my Minnow status. Reputation are now in two decimal places so you know how far you are away from next level up. Mouse hovering over the info button you can know your current voting power and weight as well.
There are still tons of new features which could enrich Steem experience on steemit like a new delegation button, Steem/SBD/USD live rate, customizatble feed, favorites followees list, and so on.
After all, this toolbox has successfully drags me back a little from Busy.com!
最近出了一个很有用的神器 SteemPlus，不仅结合了之前的 Steem More Info 的种种功能，还加入了更多有趣也有用的玩法！其中最有趣的就是自动识别系统，可以自动帮你判断 Steemit 上所有名字的身份，是人类是机器人还是灌水者。当然该机器逻辑也不是完美的，比如 @jubi 就倍判定为 Spammer，看了实在是搞笑。
开启了这个插件还可让个人主页变得更直观。左边多了代表身份的锦旗，声望也多了两个小数点，就可以刚准确的知道自己里升级还有多远啦。还有太多的小改进和红能实在不能一一举例，有兴趣的就去 @steem-plus 看看吧！
总的来说，使用 Chrome 的走过路过不要错过。
This page is synchronized from the post: ‘A must-have toolbox on Steemit’


La Rochelle is a beautiful Medieval City with an imposing fortified old harbour dating back to the Middle Ages. Due to the high tides on this coast, the old harbour has lock gates, the confinement however is worth it as the old harbour is right in the heart of the City. Cruisers may find it easier to use La Rochelle as a base from which to visit other ports and towns nearby by hire car.
Position 48°08' 51"N, 01°10' 37"W
Beware that occasional dredging takes place in the channel. Take particular care if arriving in the dark as there are also unlit buoys and pole markers.
If wishing to moor in the Old Port (max. length 14m), it is advisable to make arrangements in advance, especially during the high season.
The huge Port des Minimes is some way from the city centre and is to sta'bd at the start of the approach channel to the Vieux Port.
Last updated May 2015.
[Show additional 1 entries for this category]


| I l@ve RuBoard |
11.2 Transferring Files over the NetAs we saw in the previous chapter, sockets see plenty of action on the Net. For instance, the getfile example at the end of that chapter allowed us to transfer entire files between machines. In practice, though, higher-level protocols are behind much of what happens on the Net. Protocols run on top of sockets, but hide much of the complexity of the network scripting examples we've just seen. FTP -- the File Transfer Protocol -- is one of the more commonly used Internet protocols. It defines a higher-level conversation model that is based on exchanging command strings and file contents over sockets. By using FTP, we can accomplish the same task as the prior chapter's getfile script, but the interface is simpler, and standard -- FTP lets us ask for files from any server machine that supports FTP, without requiring that it run our custom getfile script. FTP also supports more advanced operations such as uploading files to the server, getting remote directory listings, and more. Really, FTP runs on top of two sockets: one for passing control commands between client and server (port 21), and another for transferring bytes. By using a two-socket model, FTP avoids the possibility of deadlocks (i.e., transfers on the data socket do not block dialogs on the control socket). Ultimately, though, Python's ftplib support module allows us to upload and download files at a remote server machine by FTP, without dealing in raw socket calls or FTP protocol details. 11.2.1 FTP: Fetching Python with PythonBecause the Python FTP interface is so easy to use, let's jump right into a realistic example. The script in Example 11-1 automatically fetches and builds Python with Python. No, this isn't a recursive chicken-and-egg thought exercise -- you must already have installed Python to run this program. More specifically, this Python script does the following:
The download portion will run on any machine with Python and sockets; the unpacking and compiling code assumes a Unix-like build environment as coded here, but could be tweaked to work with other platforms. Example 11-1. PP2E\Internet\Ftp\getpython.py#!/usr/local/bin/python ############################################################### # A Python script to download and build Python's source code. # Uses ftplib, the ftp protocol handler which uses sockets. # Ftp runs on 2 sockets (one for data, one for control--on # ports 20 and 21) and imposes message text formats, but the # Python ftplib module hides most of this protocol's details. ############################################################### import os from ftplib import FTP # socket-based ftp tools Version = '1.5' # version to download tarname = 'python%s.tar.gz' % Version # remote/local file name print 'Connecting...' localfile = open(tarname, 'wb') # where to store download connection = FTP('ftp.python.org') # connect to ftp site connection.login() # default is anonymous login connection.cwd('pub/python/src') # xfer 1k at a time to localfile print 'Downloading...' connection.retrbinary('RETR ' + tarname, localfile.write, 1024) connection.quit() localfile.close() print 'Unpacking...' os.system('gzip -d ' + tarname) # decompress os.system('tar -xvf ' + tarname[:-3]) # strip .gz print 'Building...' os.chdir('Python-' + Version) # build Python itself os.system('./configure') # assumes unix-style make os.system('make') os.system('make test') print 'Done: see Python-%s/python.' % Version Most of the FTP protocol details are encapsulated by the Python ftplib module imported here. This script uses some of the simplest interfaces in ftplib (we'll see others in a moment), but they are representative of the module in general: connection = FTP('ftp.python.org') # connect to ftp site To open a connection to a remote (or local) FTP server, create an instance of the ftplib.FTP object, passing in the name (domain or IP-style) of the machine you wish to connect to. Assuming this call doesn't throw an exception, the resulting FTP object exports methods that correspond to the usual FTP operations. In fact, Python scripts act much like typical FTP client programs -- just replace commands you would normally type or select with method calls: connection.login() # default is anonymous login connection.cwd('pub/python/src') # xfer 1k at a time to localfile Once connected, we log in, and go to the remote directory we want to fetch a file from. The login method allows us to pass in additional optional arguments to specify a username and password; by default it performs anonymous FTP: connection.retrbinary('RETR ' + tarname, localfile.write, 1024) connection.quit() Once we're in the target directory, we simply call the retrbinary method to download the target server file in binary mode. The retrbinary call will take awhile to complete, since it must download a big file. It gets three arguments:
Because this script creates a local file named localfile, of the same name as the remote file being fetched, and passes its write method to the FTP retrieval method, the remote file's contents will automatically appear in a local, client-side file after the download is finished. By the way, notice that this file is opened in "wb" binary output mode; if this script is run on Windows, we want to avoid automatically expanding and \n bytes into \r\n byte sequences (that happens automatically on Windows when writing files opened in "w" text mode). Finally, we call the FTP quit method to break the connection with the server and manually close the local file to force it to be complete before it is further processed by the shell commands spawned by os.system (it's not impossible that parts of the file are still held in buffers before the close call): connection.quit() localfile.close() And that's all there is to it; all the FTP, socket, and networking details are hidden behind the ftplib interface module. Here is this script in action on a Linux machine, with a couple thousand output lines cut in the interest of brevity: [lutz@starship test]$ python getpython.py Connecting... Downloading... Unpacking... Python-1.5/ Python-1.5/Doc/ Python-1.5/Doc/ref/ Python-1.5/Doc/ref/.cvsignore Python-1.5/Doc/ref/fixps.py ... ...lots of tar lines deleted... ... Python-1.5/Tools/webchecker/webchecker.py Python-1.5/Tools/webchecker/websucker.py Building... creating cache ./config.cache checking MACHDEP... linux2 checking CCC... checking for --without-gcc... no checking for gcc... gcc ... ...lots of build lines deleted... ... Done: see Python-1.5/python. [lutz@starship test]$ cd Python-1.5/ [lutz@starship Python-1.5]$ ./python Python 1.5 (#1, Jul 12 2000, 12:35:52) [GCC egcs-2.91.66 19990314/Li on linux2 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> print 'The Larch!' The Larch! Such a script could be automatically executed at regular intervals (e.g., by a Unix cron job) to update a local Python install with a fresh build. But the thing to notice here is that this otherwise typical Python script fetches information from an arbitrarily remote FTP site and machine. Given an Internet link, any information published by an FTP server on the Net can be fetched by and incorporated into Python scripts using interfaces such as these. <IP_ADDRESS> Using urllib to FTP filesIn fact, FTP is just one way to transfer information across the Net, and there are more general tools in the Python library to accomplish the prior script's download. Perhaps the most straightforward is the Python urllib module: given an Internet address string -- a URL, or Universal Resource Locator -- this module opens a connection to the specified server and returns a file-like object ready to be read with normal file object method calls (e.g., read, readlines). We can use such a higher-level interface to download anything with an address on the Web -- files published by FTP sites (using URLs that start with "ftp://"), web pages and outputs of scripts that live on remote servers (using "http://" URLs), local files (using "file://" URLs), Gopher server data, and more. For instance, the script in Example 11-2 does the same as the one in Example 11-1, but it uses the general urllib module to fetch the source distribution file, instead of the protocol-specific ftplib. Example 11-2. PP2E\Internet\Ftp\getpython-urllib.py#!/usr/local/bin/python ################################################################### # A Python script to download and build Python's source code # use higher-level urllib instead of ftplib to fetch file # urllib supports ftp, http, and gopher protocols, and local files # urllib also allows downloads of html pages, images, text, etc.; # see also Python html/xml parsers for web pages fetched by urllib; ################################################################### import os import urllib # socket-based web tools Version = '1.5' # version to download tarname = 'python%s.tar.gz' % Version # remote/local file name remoteaddr = 'ftp://ftp.python.org/pub/python/src/' + tarname print 'Downloading', remoteaddr # this works too: # urllib.urlretrieve(remoteaddr, tarname) remotefile = urllib.urlopen(remoteaddr) # returns input file-like object localfile = open(tarname, 'wb') # where to store data locally localfile.write(remotefile.read()) localfile.close() remotefile.close() # the rest is the same execfile('buildPython.py') Don't sweat the details of the URL string used here; we'll talk much more about URLs in the next chapter. We'll also use urllib again in this and later chapters to fetch web pages, format generated URL strings, and get the output of remote scripts on the Web.[1] Technically speaking, urllib supports a variety of Internet protocols (HTTP, FTP, Gopher, and local files), is only used for reading remote objects (not writing or uploading them), and retrievals must generally be run in threads if blocking is a concern. But the basic interface shown in this script is straightforward. The call:
remotefile = urllib.urlopen(remoteaddr) # returns input file-like object contacts the server named in the remoteaddr URL string and returns a file-like object connected to its download stream (an FTP-based socket). Calling this file's read method pulls down the file's contents, which are written to a local client-side file. An even simpler interface: urllib.urlretrieve(remoteaddr, tarname) also does the work of opening a local file and writing the downloaded bytes into it -- things we do manually in the script as coded. This comes in handy if we mean to download a file, but is less useful if we want to process its data immediately. Either way, the end result is the same: the desired server file shows up on the client machine. The remainder of the script -- unpacking and building -- is identical to the original version, so it's been moved to a reusable Python file run with the execfile built-in (recall that execfile runs a file as though its code were pasted into the place where the execfile appears). The script is shown in Example 11-3. Example 11-3. PP2E\Internet\Ftp\buildPython.py#!/usr/local/bin/python ############################################################### # A Python script to build Python from its source code. # Run me in directory where Python source distribution lives. ############################################################### import os Version = '1.5' # version to build tarname = 'python%s.tar.gz' % Version # remote/local file name print 'Unpacking...' os.system('gzip -d ' + tarname) # decompress file os.system('tar -xvf ' + tarname[:-3]) # untar without '.gz' print 'Building...' os.chdir('Python-' + Version) # build Python itself os.system('./configure') # assumes unix-style make os.system('make') os.system('make test') print 'Done: see Python-%s/python.' % Version The output this time is almost identical to the output of Example 11-1, so I'll show only a few portions (the gzip message appears if you don't delete a tar file left by a run in the past): [lutz@starship test]$ python getpython-urllib.py Downloading ftp://ftp.python.org/pub/python/src/python1.5.tar.gz Unpacking... gzip: python1.5.tar already exists; do you wish to overwrite (y or n)? y ...tar lines... Building... ...build lines... Done: see Python-1.5/python. [lutz@starship test]$ python buildPython.py Unpacking... ...tar and build lines... In fact, although the original script is all top-level code that runs immediately and accomplishes only one task, there really are two potentially reusable activities within it: fetching a file and building Python from source. By splitting each part off into a module of its own, we can reuse its program logic in other contexts, which naturally leads us to the topic in the next section. 11.2.2 FTP get and put UtilitiesAlmost invariably, when I present the ftplib interfaces in Python classes, students ask why programmers need to supply the RETR string in the retrieval method. It's a good question -- the RETR string is the name of the download command in the FTP protocol, but ftplib is supposed to encapsulate that protocol. As we'll see in a moment, we have to supply an arguably odd STOR string for uploads as well. It's boilerplate code that you accept on faith once you see it, but that begs the question. You could always email Guido a proposed ftplib patch, but that's not really a good answer for beginning Python students.[2]
A better answer is that there is no law against extending the standard library modules with higher-level interfaces of our own -- with just a few lines of reusable code, we can make the FTP interface look any way we want in Python. For instance, we could, once and for all, write utility modules that wrap the ftplib interfaces to hide the RETR string. If we place these utility modules in a directory on PYTHONPATH, they become just as accessible as ftplib itself, automatically reusable in any Python script we write in the future. Besides removing the RETR string requirement, a wrapper module could also make assumptions that simplify FTP operations into single function calls. For instance, given a module that encapsulates and simplifies ftplib, our Python fetch-and-build script could be further reduced to the script shown in Example 11-4 -- essentially just a function call and file execution. Example 11-4. PP2E\Internet\Ftp\getpython-modular.py#!/usr/local/bin/python ################################################################ # A Python script to download and build Python's source code. # Uses getfile.py, a utility module which encapsulates ftp step. ################################################################ import getfile Version = '1.5' # version to download tarname = 'python%s.tar.gz' % Version # remote/local file name # fetch with utility getfile.getfile(tarname, 'ftp.python.org', 'pub/python/src') # rest is the same execfile('buildPython.py') Besides having a line count that is much more impressive to marketeers, the meat of this script has been split off into files for reuse elsewhere. If you ever need to download a file again, simply import an existing function rather than copying code with cut-and-paste editing. Changes in download operations would need to be made in only one file, not everywhere we've copied boilerplate code; getfile.getfile could even be changed to use urllib instead of ftplib without effecting any of its clients.  Given the ftplib library module, wrapping downloads of a particular file in a particular directory is straightforward. Connected FTP objects support two download methods:
We will meet the retrlines method in a later example; the getfile utility module in Example 11-5 transfers in binary mode always with retrbinary. That is, files are downloaded exactly as they were on the server, byte for byte, with the server's line-feed conventions in text files. You may need to convert line-feeds after downloads if they look odd in your text editor -- see the converter tools in Chapter 5, for pointers. Example 11-5. PP2E\Internet\Ftp\getfile.py#!/usr/local/bin/python ################################################# # Fetch an arbitrary file by ftp. Anonymous # ftp unless you pass a user=(name, pswd) tuple. # Gets the Monty Python theme song by default. ################################################# from ftplib import FTP # socket-based ftp tools from os.path import exists # file existence test file = 'sousa.au' # default file coordinates site = 'ftp.python.org' # monty python theme song dir = 'pub/python/misc' def getfile(file=file, site=site, dir=dir, user=(), verbose=1, force=0): """ fetch a file by ftp from a site/directory anonymous or real login, binary transfer """ if exists(file) and not force: if verbose: print file, 'already fetched' else: if verbose: print 'Downloading', file local = open(file, 'wb') # local file of same name try: remote = FTP(site) # connect to ftp site apply(remote.login, user) # anonymous=() or (name, pswd) remote.cwd(dir) remote.retrbinary('RETR ' + file, local.write, 1024) remote.quit() finally: local.close() # close file no matter what if verbose: print 'Download done.' # caller handles exceptions if __name__ == '__main__': getfile() # anonymous python.org login This module is mostly just a repackaging of the FTP code we used to fetch the Python source distribution earlier, to make it simpler and reusable. Because it is a callable function, the exported getfile.getfile here tries to be as robust and generally useful as possible, but even a function this small implies some design decisions. Here are a few usage notes:
Notice also that, despite its name, this module is very different than the getfile.py script we studied at the end of the sockets material in the previous chapter. The socket-based getfile implemented client and server-side logic to download a server file to a client machine over raw sockets. This new getfile here is a client-side tool only. Instead of raw sockets, it uses the simpler FTP protocol to request a file from a server; all socket-level details are hidden in the ftplib module's implementation of the FTP client protocol. Furthermore, the server here is a perpetually running program on the server machine, which listens for and responds to FTP requests on a socket, on the dedicated FTP port (number 21). The net functional effect is that this script requires an FTP server to be running on the machine where the desired file lives, but such a server is much more likely to be available. <IP_ADDRESS> Upload utilityWhile we're at it, let's write a script to upload a single file by FTP to a remote machine. The upload interfaces in the FTP module are symmetric with the download interfaces. Given a connected FTP object:
Unlike the download interfaces, both of these methods are passed a file object as a whole, not a file object method (or other function). We will meet the storlines method in a later example. The utility module in Example 11-6 uses storbinary such that the file whose name is passed in is always uploaded verbatim -- in binary mode, without line-feed translations for the target machine's conventions. If this script uploads a text file, it will arrive exactly as stored on the machine it came from, client line-feed markers and all. Example 11-6. PP2E\Internet\Ftp\putfile.py#!/usr/local/bin/python ################################################## # Store an arbitrary file by ftp. Anonymous # ftp unless you pass a user=(name, pswd) tuple. ################################################## import ftplib # socket-based ftp tools file = 'sousa.au' # default file coordinates site = 'starship.python.net' # monty python theme song dir = 'upload' def putfile(file=file, site=site, dir=dir, user=(), verbose=1): """ store a file by ftp to a site/directory anonymous or real login, binary transfer """ if verbose: print 'Uploading', file local = open(file, 'rb') # local file of same name remote = ftplib.FTP(site) # connect to ftp site apply(remote.login, user) # anonymous or real login remote.cwd(dir) remote.storbinary('STOR ' + file, local, 1024) remote.quit() local.close() if verbose: print 'Upload done.' if __name__ == '__main__': import sys, getpass pswd = getpass.getpass(site + ' pswd?') # filename on cmdline putfile(file=sys.argv[1], user=('lutz', pswd)) # non-anonymous login Notice that for portability, the local file is opened in "rb" binary mode this time to suppress automatic line-feed character conversions in case this is run on Windows; if this is binary information, we don't want any bytes that happen to have the value of the \r carriage-return character to mysteriously go away during the transfer. Also observe that the standard Python getpass.getpass is used to ask for an FTP password in standalone mode. Like the raw_input built-in function, this call prompts for and reads a line of text from the console user; unlike raw_input, getpass does not echo typed characters on the screen at all (in fact, on Windows it uses the low-level direct keyboard interface we met in the stream redirection section of Chapter 2). This comes in handy for protecting things like passwords from potentially prying eyes. Like the download utility, this script uploads a local copy of an audio file by default as a self-test, but you will normally pass in real remote filename, site name, and directory name strings. Also like the download utility, you may pass a (username, password) tuple to the user argument to trigger non-anonymous FTP mode (anonymous FTP is the default). <IP_ADDRESS> Playing the Monty Python theme songWake up -- it's time for a bit of fun. Let's make use of these scripts to transfer and play the Monty Python theme song audio file maintained at Python's web site. First off, let's write a module that downloads and plays the sample file, as shown in Example 11-7. Example 11-7. PP2E\Internet\Ftp\sousa.py#!/usr/local/bin/python ################################################# # Usage: % sousa.py # Fetch and play the Monty Python theme song. # This may not work on your system as is: it # requires a machine with ftp access, and uses # audio filters on Unix and your .au player on # Windows. Configure playfile.py as needed. ################################################# import os, sys from PP2E.Internet.Ftp.getfile import getfile from PP2E.Internet.Ftp.playfile import playfile sample = 'sousa.au' getfile(sample) # fetch audio file by ftp playfile(sample) # send it to audio player This script will run on any machine with Python, an Internet link, and a recognizable audio player; it works on my Windows laptop with a dialup Internet connection (if I could insert an audio file hyperlink here to show what it sounds like, I would): C:\...\PP2E\Internet\Ftp>python sousa.py Downloading sousa.au Download done. C:\...\PP2E\Internet\Ftp>python sousa.py sousa.au already fetched The getfile and putfile modules can be used to move the sample file around, too. Both can either be imported by clients that wish to use their functions, or run as top-level programs to trigger self-tests. Let's run these scripts from a command line and the interactive prompt to see how they work. When run standalone, parameters are passed in the command line, and the default file settings are used: C:\...\PP2E\Internet\Ftp>python putfile.py sousa.au starship.python.net pswd? Uploading sousa.au Upload done. When imported, parameters are passed explicitly to functions: C:\...\PP2E\Internet\Ftp>python >>> from getfile import getfile >>> getfile(file='sousa.au', site='starship.python.net', dir='upload', ... user=('lutz', '****')) Downloading sousa.au Download done. >>> from playfile import playfile >>> playfile('sousa.au') I've left one piece out of the puzzle: all that's left is to write a module that attempts to play an audio file portably (see Example 11-8). Alas, this is the least straightforward task because audio players vary per platform. On Windows, the following module uses the DOS start command to launch whatever you have registered to play audio files (exactly as if you had double-clicked on the file's icon in a file explorer); on the Windows 98 side of my Sony notebook machine, this DOS command line: C:\...\PP2E\Internet\Ftp>python playfile.py sousa.au pops up a media bar playing the sample. On Unix, it attempts to pass the audio file to a command-line player program, if one has been added to the unixfilter table -- tweak this for your system (cat 'ing audio files to /dev/audio works on some Unix systems, too). On other platforms, you'll need to do a bit more; there has been some work towards portable audio interfaces in Python, but it's notoriously platform-specific. Web browsers generally know how to play audio files, so passing the filename in a URL to a browser located via the LaunchBrowser.py script we met in Chapter 4, is perhaps a portable solution here as well (see that chapter for interface details). Example 11-8. PP2E\Internet\Ftp\playfile.py#!/usr/local/bin/python ################################################# # Try to play an arbitrary audio file. # This may not work on your system as is; it # uses audio filters on Unix, and filename # associations on Windows via the start command # line (i.e., whatever you have on your machine # to run *.au files--an audio player, or perhaps # a web browser); configure me as needed. We # could instead launch a web browser here, with # LaunchBrowser.py. See also: Lib/audiodev.py. ################################################# import os, sys sample = 'sousa.au' # default audio file unixhelpmsg = """ Sorry: can't find an audio filter for your system! Add an entry for your system to the "unixfilter" dictionary in playfile.py, or play the file manually. """ unixfilter = {'sunos5': '/usr/bin/audioplay', 'linux2': '<unknown>', 'sunos4': '/usr/demo/SOUND/play'} def playfile(sample=sample): """ play an audio file: use name associations on windows, filter command-lines elsewhere """ if sys.platform[:3] == 'win': os.system('start ' + sample) # runs your audio player else: if not (unixfilter.has_key(sys.platform) and os.path.exists(unixfilter[sys.platform])): print unixhelpmsg else: theme = open(sample, 'r') audio = os.popen(unixfilter[sys.platform], 'w') # spawn shell tool audio.write(theme.read()) # send to its stdin if __name__ == '__main__': playfile() <IP_ADDRESS> Adding user interfacesIf you read the last chapter, you'll recall that it concluded with a quick look at scripts that added a user interface to a socket-based getfile script -- one that transferred files over a proprietary socket dialog, instead of FTP. At the end of that presentation, I mentioned that FTP is a much more generally useful way to move files around, because FTP servers are so widely available on the Net. For illustration purposes, Example 11-9 shows a simple mutation of the last chapter's user interface, implemented as a new subclass of the last chapter's general form builder. Example 11-9. P2E\Internet\Ftp\getfilegui.py############################################################### # launch ftp getfile function with a reusable form gui class; # uses os.chdir to goto target local dir (getfile currently # assumes that filename has no local directory path prefix); # runs getfile.getfile in thread to allow more than one to be # running at once and avoid blocking gui during downloads; # this differs from socket-based getfilegui, but reuses Form; # supports both user and anonymous ftp as currently coded; # caveats: the password field is not displayed as stars here, # errors are printed to the console instead of shown in the # gui (threads can't touch the gui on Windows), this isn't # 100% thread safe (there is a slight delay between os.chdir # here and opening the local output file in getfile) and we # could display both a save-as popup for picking the local dir, # and a remote directory listings for picking the file to get; ############################################################### from Tkinter import Tk, mainloop from tkMessageBox import showinfo import getfile, os, sys, thread # ftp getfile here, not socket from PP2E.Internet.Sockets.form import Form # reuse form tool in socket dir class FtpForm(Form): def __init__(self): root = Tk() root.title(self.title) labels = ['Server Name', 'Remote Dir', 'File Name', 'Local Dir', 'User Name?', 'Password?'] Form.__init__(self, labels, root) self.mutex = thread.allocate_lock() self.threads = 0 def transfer(self, filename, servername, remotedir, userinfo): try: self.do_transfer(filename, servername, remotedir, userinfo) print '%s of "%s" successful' % (self.mode, filename) except: print '%s of "%s" has failed:' % (self.mode, filename), print sys.exc_info()[0], sys.exc_info()[1] self.mutex.acquire() self.threads = self.threads - 1 self.mutex.release() def onSubmit(self): Form.onSubmit(self) localdir = self.content['Local Dir'].get() remotedir = self.content['Remote Dir'].get() servername = self.content['Server Name'].get() filename = self.content['File Name'].get() username = self.content['User Name?'].get() password = self.content['Password?'].get() userinfo = () if username and password: userinfo = (username, password) if localdir: os.chdir(localdir) self.mutex.acquire() self.threads = self.threads + 1 self.mutex.release() ftpargs = (filename, servername, remotedir, userinfo) thread.start_new_thread(self.transfer, ftpargs) showinfo(self.title, '%s of "%s" started' % (self.mode, filename)) def onCancel(self): if self.threads == 0: Tk().quit() else: showinfo(self.title, 'Cannot exit: %d threads running' % self.threads) class FtpGetfileForm(FtpForm): title = 'FtpGetfileGui' mode = 'Download' def do_transfer(self, filename, servername, remotedir, userinfo): getfile.getfile(filename, servername, remotedir, userinfo, 0, 1) if __name__ == '__main__': FtpGetfileForm() mainloop() If you flip back to the end of the previous chapter, you'll find that this version is similar in structure to its counterpart there; in fact, it has the same name (and is distinct only because it lives in a different directory). The class here, though, knows how to use the FTP-based getfile module from earlier in this chapter, instead of the socket-based getfile module we met a chapter ago. When run, this version also implements more input fields, as we see in Figure 11-1. Figure 11-1. FTP getfile input formNotice that a full file path is entered for the local directory here. Otherwise, the script assumes the current working directory, which changes after each download and can vary depending on where the GUI is launched (e.g., the current directory differs when this script is run by the PyDemos program at the top of the examples tree). When we click this GUI's Submit button (or press the Enter key), this script simply passes the form's input field values as arguments to the getfile.getfile FTP utility function shown earlier in this section. It also posts a pop-up to tell us the download has begun (Figure 11-2). Figure 11-2. FTP getfile info pop-upAs currently coded, further download status messages from this point on show up in the console window; here are the messages for a successful download, as well as one that failed when I mistyped my password (no, it's not really "xxxxxx"): User Name? => lutz Server Name => starship.python.net Local Dir => c:\temp Password? => xxxxxx File Name => index.html Remote Dir => public_html/home Download of "index.html" successful User Name? => lutz Server Name => starship.python.net Local Dir => c:\temp Password? => xxxxxx File Name => index.html Remote Dir => public_html/home Download of "index.html" has failed: ftplib.error_perm 530 Login incorrect. Given a username and password, the downloader logs into the specified account. To do anonymous FTP instead, leave the username and password fields blank. Let's start an anonymous FTP connection to fetch the Python source distribution; Figure 11-3 shows the filled-out form. Figure 11-3. FTP getfile input form, anonymous FTPPressing Submit on this form starts a download running in the background as before; we get the pop-up shown in Figure 11-4 to verify the startup. Figure 11-4. FTP getfile info pop-upNow, to illustrate the threading capabilities of this GUI, let's start another download while this one is in progress. The GUI stays active while downloads are under way, so we simply change the input fields and press Submit again, as done in Figure 11-5. Figure 11-5. FTP getfile input form, second threadThis second download starts in parallel with the one attached to ftp.python.org, because each download is run in a thread, and more than one Internet connection can be active at once. In fact, the GUI itself stays active during downloads only because downloads are run in threads; if they were not, even screen redraws wouldn't happen until a download finished. We discussed threads in Chapter 3, but this script illustrates some practical thread concerns:
Figure 11-6. FTP getfile busy pop-upWe'll see ways to work around the no-GUI rule for threads when we explore the PyMailGui example near the end of this chapter. To be portable, though, we can't really close the GUI until the active-thread count falls to zero. Here is the sort of output that appears in the console window for these two downloads: C:\...\PP2E\Internet\Ftp>python getfilegui.py User Name? => Server Name => ftp.python.org Local Dir => c:\temp Password? => File Name => python1.5.tar.gz Remote Dir => pub/python/src User Name? => lutz Server Name => starship.python.net Local Dir => c:\temp Password? => xxxxxx File Name => about-pp.html Remote Dir => public_html/home Download of "about-pp.html" successful Download of "python1.5.tar.gz" successful This all isn't much more useful than a command-line-based tool, of course, but it can be easily modified by changing its Python code, and it provides enough of a GUI to qualify as a simple, first-cut FTP user interface. Moreover, because this GUI runs downloads in Python threads, more than one can be run at the same time from this GUI without having to start or restart a different FTP client tool. While we're in a GUI mood, let's add a simple interface to the putfile utility, too. The script in Example 11-10 creates a dialog that starts uploads in threads. It's almost the same as the getfile GUI we just wrote, so there's nothing new to say. In fact, because get and put operations are so similar from an interface perspective, most of the get form's logic was deliberately factored out into a single generic class (FtpForm) such that changes need only be made in a single place. That is, the put GUI here is mostly just a reuse of the get GUI, with distinct output labels and transfer method. It's in a file by itself to make it easy to launch as a standalone program. Example 11-10. PP2E\Internet\Ftp\putfilegui.py############################################################### # launch ftp putfile function with a reusable form gui class; # see getfilegui for notes: most of the same caveats apply; # the get and put forms have been factored into a single # class such that changes need only be made in one place; ############################################################### from Tkinter import mainloop import putfile, getfilegui class FtpPutfileForm(getfilegui.FtpForm): title = 'FtpPutfileGui' mode = 'Upload' def do_transfer(self, filename, servername, remotedir, userinfo): putfile.putfile(filename, servername, remotedir, userinfo, 0) if __name__ == '__main__': FtpPutfileForm() mainloop() Running this script looks much like running the download GUI, because it's almost entirely the same code at work. Let's upload a couple of files from the client machine to the starship server; Figure 11-7 shows the state of the GUI while starting one. Figure 11-7. FTP putfile input formAnd here is the console window output we get when uploading two files in parallel; here again, uploads run in threads, so if we start a new upload before one in progress is finished, they overlap in time: User Name? => lutz Server Name => starship.python.net Local Dir => c:\stuff\website\public_html Password? => xxxxxx File Name => about-pp2e.html Remote Dir => public_html User Name? => lutz Server Name => starship.python.net Local Dir => c:\stuff\website\public_html Password? => xxxxxx File Name => about-ppr2e.html Remote Dir => public_html Upload of "about-pp2e.html" successful Upload of "about-ppr2e.html" successful Finally, we can bundle up both GUIs in a single launcher script that knows how to start the get and put interfaces, regardless of which directory we are in when the script is started, and independent of the platform on which it runs. Example 11-11 shows this process. Example 11-11. PP2E\Internet\Ftp\PyFtpGui.pyw################################################################ # spawn ftp get and put guis no matter what dir I'm run from; # os.getcwd is not necessarily the place this script lives; # could also hard-code a path from $PP2EHOME, or guessLocation; # could also do this but need the DOS popup for status messages: # from PP2E.launchmodes import PortableLauncher # PortableLauncher('getfilegui', '%s/getfilegui.py' % mydir)() ################################################################ import os, sys from PP2E.Launcher import findFirst mydir = os.path.split(findFirst(os.curdir, 'PyFtpGui.pyw'))[0] if sys.platform[:3] == 'win': os.system('start %s/getfilegui.py' % mydir) os.system('start %s/putfilegui.py' % mydir) else: os.system('python %s/getfilegui.py &' % mydir) os.system('python %s/putfilegui.py &' % mydir) When this script is started, both the get and put GUIs appear as distinct, independently running programs; alternatively, we might attach both forms to a single interface. We could get much fancier than these two interfaces, of course. For instance, we could pop up local file selection dialogs, and we could display widgets that give status of downloads and uploads in progress. We could even list files available at the remote site in a selectable list box by requesting remote directory listings over the FTP connection. To learn how to add features like that, though, we need to move on to the next section. 11.2.3 Downloading Web Sites (Mirrors)Once upon a time, Telnet was all I needed. My web site lived at an Internet Service Provider (ISP) that provided general and free Telnet access for all its customers. It was a simple time. All of my site's files lived only in one place -- at my account directory on my ISP's server machine. To make changes to web pages, I simply started a Telnet session connected to my ISP's machine and edited my web pages there online. Moreover, because Telnet sessions can be run from almost any machine with an Internet link, I was able to tweak my web pages everywhere -- from my PC, from machines I had access to on the training road, from archaic machines I played with when I was bored at my day job, and so on. Life was good. But times have changed. Due to a security breach, my ISP made a blanket decision to revoke Telnet access from all of their customers (except, of course, those who elected to pay a substantial premium to retain it). Seemingly, we weren't even supposed to have known about Telnet in the first place. As a replacement, the ISP mandated that all Telnet-inclined users should begin maintaining web page files locally on their own machines, and upload them by FTP after every change. That's nowhere near as nice as editing files kept in a single place from almost any computer on the planet, of course, and this triggered plenty of complaints and cancellations among the technically savvy. Unfortunately, the technically savvy is a financially insignificant subset; more to the point, my web page's address had by this time been published in multiple books sold around the world, so changing ISPs would have been no less painful than changing update procedures. After the shouting, it dawned on me that Python could help here: by writing Python scripts to automate the upload and download tasks associated with maintaining my web site on my PC, I could at least get back some of the mobility and ease of use that I'd lost. Because Python FTP scripts will work on any machine with sockets, I could run them both on my PC and on nearly any other computer where Python was installed. Furthermore, the same scripts used to transfer page files to and from my PC could be used to copy ("mirror") my site to another web server as a backup copy, should my ISP experience an outage (trust me -- it happens). The following two scripts were born of all of the above frustrations. The first, mirrorflat.py, automatically downloads (i.e., copies) by FTP all the files in a directory at a remote site, to a directory on the local machine. I keep the main copy of my web site files on my PC these days, but really use this script in two ways:
More generally, this script (shown in Example 11-12) will download a directory full of files to any machine with Python and sockets, from any machine running an FTP server. Example 11-12. PP2E\Internet\Ftp\mirrorflat.py#!/bin/env python ########################################################### # use ftp to copy (download) all files from a remote site # and directory to a directory on the local machine; e.g., # run me periodically to mirror a flat ftp site; ########################################################### import os, sys, ftplib from getpass import getpass remotesite = 'home.rmi.net' remotedir = 'public_html' remoteuser = 'lutz' remotepass = getpass('Please enter password for %s: ' % remotesite) localdir = (len(sys.argv) > 1 and sys.argv[1]) or '.' if sys.platform[:3] == 'win': raw_input() # clear stream cleanall = raw_input('Clean local directory first? ')[:1] in ['y', 'Y'] print 'connecting...' connection = ftplib.FTP(remotesite) # connect to ftp site connection.login(remoteuser, remotepass) # login as user/password connection.cwd(remotedir) # cd to directory to copy if cleanall: for localname in os.listdir(localdir): # try to delete all locals try: # first to remove old files print 'deleting local', localname os.remove(os.path.join(localdir, localname)) except: print 'cannot delete local', localname count = 0 # download all remote files remotefiles = connection.nlst() # nlst() gives files list # dir() gives full details for remotename in remotefiles: localname = os.path.join(localdir, remotename) print 'copying', remotename, 'to', localname if remotename[-4:] == 'html' or remotename[-3:] == 'txt': # use ascii mode xfer localfile = open(localname, 'w') callback = lambda line, file=localfile: file.write(line + '\n') connection.retrlines('RETR ' + remotename, callback) else: # use binary mode xfer localfile = open(localname, 'wb') connection.retrbinary('RETR ' + remotename, localfile.write) localfile.close() count = count+1 connection.quit() print 'Done:', count, 'files downloaded.' There is not a whole lot new to speak of in this script, compared to other FTP examples we've seen thus far. We open a connection with the remote FTP server, log in with a username and password for the desired account (this script never uses anonymous FTP), and go to the desired remote directory. New here, though, are loops to iterate over all the files in local and remote directories, text-based retrievals, and file deletions:
All of this is simpler in action than in words. Here is the command I use to download my entire web site from my ISP server account to my Windows 98 laptop PC, in a single step: C:\Stuff\Website\public_html>python %X%\internet\ftp\mirrorflat.py Please enter password for home.rmi.net: Clean local directory first? connecting... copying UPDATES to .\UPDATES copying PythonPowered.gif to .\PythonPowered.gif copying Pywin.gif to .\Pywin.gif copying PythonPoweredAnim.gif to .\PythonPoweredAnim.gif copying PythonPoweredSmall.gif to .\PythonPoweredSmall.gif copying about-hopl.html to .\about-hopl.html copying about-lp.html to .\about-lp.html ... ...lines deleted... ... copying training.html to .\training.html copying trainingCD.GIF to .\trainingCD.GIF copying uk-1.jpg to .\uk-1.jpg copying uk-2.jpg to .\uk-2.jpg copying uk-3.jpg to .\uk-3.jpg copying whatsnew.html to .\whatsnew.html copying whatsold.html to .\whatsold.html copying xlate-lp.html to .\xlate-lp.html copying uploadflat.py to .\uploadflat.py copying ora-lp-france.gif to .\ora-lp-france.gif Done: 130 files downloaded. This can take awhile to complete (it's bound by network speed constraints), but it is much more accurate and easy than downloading files by hand. The script simply iterates over all the remote files returned by the nlst method, and downloads each with the FTP protocol (i.e., over sockets) in turn. It uses text transfer mode for names that imply obviously text data, and binary mode for others. With the script running this way, I make sure the initial assignments in it reflect the machines involved, and then run the script from the local directory where I want the site copy to be stored. Because the download directory is usually not where the script lives, I need to give Python the full path to the script file (%X% evaluates a shell variable containing the top-level path to book examples on my machine). When run on the starship server in a Telnet session window, the execution and script directory paths are different, but the script works the same way. If you elect to delete local files in the download directory, you may also see a batch of "deleting local..." messages scroll by on the screen before any "copying..." lines appear: ... deleting local uploadflat.py deleting local whatsnew.html deleting local whatsold.html deleting local xlate-lp.html deleting local old-book.html deleting local about-pp2e.html deleting local about-ppr2e.html deleting local old-book2.html deleting local mirrorflat.py ... copying about-pp-japan.html to ./about-pp-japan.html copying about-pp.html to ./about-pp.html copying about-ppr-germany.html to ./about-ppr-germany.html copying about-ppr-japan.html to ./about-ppr-japan.html copying about-ppr-toc.html to ./about-ppr-toc.html ... By the way, if you botch the input of the remote site password, a Python exception is raised; I sometimes need to run again (and type slower): C:\Stuff\Website\public_html>python %X%\internet\ftp\mirrorflat.py Please enter password for home.rmi.net: Clean local directory first? connecting... Traceback (innermost last): File "C:\PP2ndEd\examples\PP2E\internet\ftp\mirrorflat.py", line 20, in ? connection.login(remoteuser, remotepass) # login as user/pass.. File "C:\Program Files\Python\Lib\ftplib.py", line 316, in login if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd) File "C:\Program Files\Python\Lib\ftplib.py", line 228, in sendcmd return self.getresp() File "C:\Program Files\Python\Lib\ftplib.py", line 201, in getresp raise error_perm, resp ftplib.error_perm: 530 Login incorrect. It's worth noting that this script is at least partially configured by assignments near the top of the file. In addition, the password and deletion options are given by interactive inputs, and one command-line argument is allowed -- the local directory name to store the downloaded files (it defaults to ".", the directory where the script is run). Command-line arguments could be employed to universally configure all the other download parameters and options, too; but because of Python's simplicity and lack of compile/link steps, changing settings in the text of Python scripts is usually just as easy as typing words on a command line.
11.2.4 Uploading Web SitesUploading a full directory is symmetric to downloading: it's mostly a matter of swapping the local and remote machines and operations in the program we just met. The script in Example 11-13 uses FTP to copy all files in a directory on the local machine on which it runs, up to a directory on a remote machine. I really use this script, too, most often to upload all of the files maintained on my laptop PC to my ISP account in one fell swoop. I also sometimes use it to copy my site from my PC to its starship mirror machine, or from the mirror machine back to my ISP. Because this script runs on any computer with Python and sockets, it happily transfers a directory from any machine on the Net to any machine running an FTP server. Simply change the initial setting in this module as appropriate for the transfer you have in mind. Example 11-13. PP2E\Internet\Ftp\uploadflat.py#!/bin/env python ########################################################################## # use ftp to upload all files from a local dir to a remote site/directory; # e.g., run me to copy a web/ftp site's files from your PC to your ISP; # assumes a flat directory upload: uploadall.py does nested directories. # to go to my ISP, I change setting to 'home.rmi.net', and 'public_html'. ########################################################################## import os, sys, ftplib, getpass remotesite = 'starship.python.net' # upload to starship site remotedir = 'public_html/home' # from win laptop or other remoteuser = 'lutz' remotepass = getpass.getpass('Please enter password for %s: ' % remotesite) localdir = (len(sys.argv) > 1 and sys.argv[1]) or '.' if sys.platform[:3] == 'win': raw_input() # clear stream cleanall = raw_input('Clean remote directory first? ')[:1] in ['y', 'Y'] print 'connecting...' connection = ftplib.FTP(remotesite) # connect to ftp site connection.login(remoteuser, remotepass) # login as user/password connection.cwd(remotedir) # cd to directory to copy if cleanall: for remotename in connection.nlst(): # try to delete all remotes try: # first to remove old files print 'deleting remote', remotename connection.delete(remotename) except: print 'cannot delete remote', remotename count = 0 localfiles = os.listdir(localdir) # upload all local files # listdir() strips dir path for localname in localfiles: localpath = os.path.join(localdir, localname) print 'uploading', localpath, 'to', localname if localname[-4:] == 'html' or localname[-3:] == 'txt': # use ascii mode xfer localfile = open(localpath, 'r') connection.storlines('STOR ' + localname, localfile) else: # use binary mode xfer localfile = open(localpath, 'rb') connection.storbinary('STOR ' + localname, localfile, 1024) localfile.close() count = count+1 connection.quit() print 'Done:', count, 'files uploaded.' Like the mirror download script, the program here illustrates a handful of new FTP interfaces and a set of FTP scripting techniques:
As for the mirror download script, this program simply iterates over all files to be transferred (files in the local directory listing this time), and transfers each in turn -- in either text or binary mode, depending on the files' names. Here is the command I use to upload my entire web site from my laptop Windows 98 PC to the remote Unix server at my ISP, in a single step: C:\Stuff\Website\public_html>python %X%\Internet\Ftp\uploadflat.py Please enter password for starship.python.net: Clean remote directory first? connecting... uploading .\LJsuppcover.jpg to LJsuppcover.jpg uploading .\PythonPowered.gif to PythonPowered.gif uploading .\PythonPoweredAnim.gif to PythonPoweredAnim.gif uploading .\PythonPoweredSmall.gif to PythonPoweredSmall.gif uploading .\Pywin.gif to Pywin.gif uploading .\UPDATES to UPDATES uploading .\about-hopl.html to about-hopl.html uploading .\about-lp.html to about-lp.html uploading .\about-pp-japan.html to about-pp-japan.html ... ...lines deleted... ... uploading .\trainingCD.GIF to trainingCD.GIF uploading .\uk-1.jpg to uk-1.jpg uploading .\uk-2.jpg to uk-2.jpg uploading .\uk-3.jpg to uk-3.jpg uploading .\uploadflat.py to uploadflat.py uploading .\whatsnew.html to whatsnew.html uploading .\whatsold.html to whatsold.html uploading .\xlate-lp.html to xlate-lp.html Done: 131 files uploaded. Like the mirror example, I usually run this command from the local directory where my web files are kept, and I pass Python the full path to the script. When I run this on the starship Linux server, it works the same, but the paths to the script and my web files directory differ.  messages before the "uploading..." lines here, too: ... deleting remote uk-3.jpg deleting remote whatsnew.html deleting remote whatsold.html deleting remote xlate-lp.html deleting remote uploadflat.py deleting remote ora-lp-france.gif deleting remote LJsuppcover.jpg deleting remote sonyz505js.gif deleting remote pic14.html ... 11.2.5 Uploads with SubdirectoriesPerhaps the biggest limitation of the web site download and upload scripts we just met are that they assume the site directory is flat (hence their names) -- i.e., both transfer simple files only, and neither handles nested subdirectories within the web directory to be transferred. For my purposes, that's a reasonable constraint. I avoid nested subdirectories to keep things simple, and I store my home web site as a simple directory of files. For other sites (including one I keep at the starship machine), site transfer scripts are easier to use if they also automatically transfer subdirectories along the way. It turns out that supporting directories is fairly simple -- we need to add only a bit of recursion and remote directory creation calls. The upload script in Example 11-14 extends the one we just saw, to handle uploading all subdirectories nested within the transferred directory. Furthermore, it recursively transfers subdirectories within subdirectories -- the entire directory tree contained within the top-level transfer directory is uploaded to the target directory at the remote server. Example 11-14. PP2E\Internet\Ftp\uploadall.py#!/bin/env python ########################################################################## # use ftp to upload all files from a local dir to a remote site/directory; # this version supports uploading nested subdirectories too, but not the # cleanall option (that requires parsing ftp listings to detect remote # dirs, etc.); to upload subdirectories, uses os.path.isdir(path) to see # if a local file is really a directory, FTP().mkd(path) to make the dir # on the remote machine (wrapped in a try in case it already exists there), # and recursion to upload all files/dirs inside the nested subdirectory. # see also: uploadall-2.py, which doesn't assume the topremotedir exists. ########################################################################## import os, sys, ftplib from getpass import getpass remotesite = 'home.rmi.net' # upload from pc or starship to rmi.net topremotedir = 'public_html' remoteuser = 'lutz' remotepass = getpass('Please enter password for %s: ' % remotesite) toplocaldir = (len(sys.argv) > 1 and sys.argv[1]) or '.' print 'connecting...' connection = ftplib.FTP(remotesite) # connect to ftp site connection.login(remoteuser, remotepass) # login as user/password connection.cwd(topremotedir) # cd to directory to copy to # assumes topremotedir exists def uploadDir(localdir): global fcount, dcount localfiles = os.listdir(localdir) for localname in localfiles: localpath = os.path.join(localdir, localname) print 'uploading', localpath, 'to', localname if os.path.isdir(localpath): # recur into subdirs try: connection.mkd(localname) print localname, 'directory created' except: print localname, 'directory not created' connection.cwd(localname) uploadDir(localpath) connection.cwd('..') dcount = dcount+1 else: if localname[-4:] == 'html' or localname[-3:] == 'txt': # use ascii mode xfer localfile = open(localpath, 'r') connection.storlines('STOR ' + localname, localfile) else: # use binary mode xfer localfile = open(localpath, 'rb') connection.storbinary('STOR ' + localname, localfile, 1024) localfile.close() fcount = fcount+1 fcount = dcount = 0 uploadDir(toplocaldir) connection.quit() print 'Done:', fcount, 'files and', dcount, 'directories uploaded.' Like the flat upload script, this one can be run on any machine with Python and sockets and upload to any machine running an FTP server; I run it both on my laptop PC and on starship by Telnet to upload sites to my ISP. In the interest of space, I'll leave studying this variant in more depth as a suggested exercise. Two quick pointers, though:
For more context, also see the uploadall-2.py version of this script in the examples distribution; it's similar, but coded so as not to assume that the top-level remote directory already exists. |
| I l@ve RuBoard |


Imen Le Brun, a french young community manager and copywritter. I'm based in paris.
I fell in love with words during my childhood. I love playing with them especially when I have to find the good rhyme!
Otherwise, I'm passionate about social media. I've worked for "Jacqueline Riu" a fashion brand.
Since this experience, I want to give my best to animate a community with passion!
So, give me a chance…
In “La Brune”, we trust and we like it!


Logo Searches
Program Type:
Search All
Scholarship Program
Loan Program
Education Level:
Search All
K-12
HighSchool
Search


Kitchen Sink
Sign Out
Initiate call with user
Email required
Email required
Hangup
Toggle outgoing video
Toggle outgoing audio
Hangup
Incoming Call
Answer
Audio Only
Reject
Please rate your experience
Comments
Include Logs:
Yes
No
Send Feedback
Cancel
Comments


This is a tutorial to help first-time contributors participate in a simple and easy project. Get more comfortable using GitHub and make your first open source contribution. It's quick and easy.
Learn how to contributeContributions so far...
Kayla Alewine
I am a middle school science teacher working through a career change into the field of webdevelopment. I love yoga, hiking, reading and cooking.
Scott Jellen
Front-end developer || Web developer || Career changer
Maggie Chu
Recent Computer Science grad + Associate Product Manager.  Majoring in Computer Science.
3 Useful Dev Resources
Lucia Mezquida
Frontend developer in the present. Pharmacist in the past. Enthusiastic of coding, snowboarding and cats.
Philip
Developing Web Developer. Studying HTML, CSS, and Python at the moment. I have a passion for languages as well and I am learning Spanish at the moment. Espero que todos aquí tengan un buen día! Love Japan as well. Any random facts about Japan, manga or anime recommendations, don't be afraid to reach out!
Morgan Moreno
Self taught software developer. Basketball & video game junkie. Nature enthusiast. Always looking to learn something new.
3 Useful Dev Resources
Iqbal
Undergraduate student at UC Irvine pursuing a B.S. in Software Engineering.
3 Useful Dev Resources
Lemonbrush
Future super cool iOS Developer who is going to be the pirate king!
Dali-codes
Business Consultant transforming into front-end developer | Passionate about UX and EX | Bringing ideas to life
3 Useful Dev Resources
Edwin
Undergraduate student from University of Petroleum and Energy Studies pursuing B.Tech in Computer Science specialising in DevOps.
3 Useful Dev Resources
Shreya Purohit
I am a sophomore who loves to code and build productive web applications to help myself and others.
3 Useful Dev Resources
Pranav Singh
Pranav Singh @theBeginner86 @theBeginner86
Pursuing engineering degree from VIT Vellore, India. Loves to observe nature and people. Right now learning Web Development and fascinated by the word "Open Source". Looking to meet new people and gain more experience.
Anderson
I like to grow my own food. Sou brasileiro.
3 Useful Dev Resources
Brody
I am a cool person.
3 Useful Dev Resources
Novice
Just a newbie trying to learn a lot :)
Tina Myers
Software developer, previously worked in physical therapy in a nursing home in the Seattle, WA area. Lots of interesting stories to share! Primary Languages: JavaScript, MERN stack, redux, AWS, postreSQL, material-UI, bootstrap, react Native, Angular
Shikha
This is Shikha ,I am pursuing my B.Tech Computer Science Engineering .I am just start learning the essential thing in my field , GitHub is one of them.
Kushal Das
Mentor @ The Sparks Foundation. Python developer👨💻 || Data science enthusiastic|| Competitive programmer.
3 Useful Dev Resources
Surbhi Mayank
Flutter Developer || Competitive programmer || Java enthusiastic.
3 Useful Dev Resources
Alka Das
JAVA,C++ PROGRAMMER || Quarter way to Web Developer || Curious Learner
3 Useful Dev Resources
Augusto Arraes
Hi, I have a goal of buying my first house in 2021.
3 Useful Dev Resources
Aman
I am new to open source contribution and learning it.
3 Useful Dev Resources
Bernardo Munz
Hello there I am Bernardo, I am a future web developer, I'm trying to change my career into web developing, I being studying and doing some web project for the last 5 years just for fun but now is time to dedicate full time to this amazing world.
3 Useful Dev Resources
Cliver
I am a programming student passionate about frontend technologies, I have participated in programming contests of the ACM ICPC.
3 Useful Dev Resources
Mohammad Iftekher Ebne Jalal (Iftu)
Web-dev is kinda fun since I've been learning. I am more interested to see IoT evolving with flexible wearable devices.
3 Useful Dev Resources
Philthy-Phil-Philanthropist Ziegelbauer
take the risk or lose the chance** taking the first step to get a full stack developer.
3 Useful Dev Resources
Jeferson Cardoso.
Antifascist, developer backend
3 Useful Dev Resources
Stacy Burris
JavaScript developer with a past in cosmetology. Learning to bring my creativity into technology.
3 Useful Dev Resources
Jorawar Singh
Computer Science Student
3 Useful Dev Resources
Arif Mamon
2020 Graduate Student . Currently Developing Side Projects .
3 Useful Dev Resources
Shakira R. Salazar
Jr. Front-end Dev. Working on making a tetris game and my own soda :D
Kiran Iyer
I'm a software engineer at 100Devs. Here, I primarily design & build interactive websites with responsive features and web applications using current frameworks and packages, delivering timely solutions while maintaining customer satisfaction.
3 Useful Dev Resources
Debasish Patnaik
Trying to learn something new everyday.
3 Useful Dev Resources
Ritesh Dabral
MERN stack developer and technology enthusiast.
3 Useful Dev Resources