Introducing BactoViewer, a modular 660 nm laser-based spectrophotometer which can be used in an active incubator, to measure optical density of bio-cultures and alert the user via Bluetooth through a PC, when a specified OD is reached.
Kaimei is our circuit designer, in charge of planning the electrical circuitry. He studied material science prior to joining us, with significant background in material selection. Together with circuit design, Kaimei helps the hardware design and processing.
Grandon Buntoro
Programmer
Grandon is in charge of overall programming. His background is in bioengineering, with specialization in automation. Other than his current role, Grandon largely assists our research into the biological process of bacterial growth and reagent injection.
Caul Pameron
Hardware Designer
Caul is our hardware designer specializing in Computer Aided Drawing (CAD). He is responsible for all of our CAD drawings and 3D-printing of prototypes. His background is in bioengineering, hence is deeply involved into our bacterial growth research.
Tana Aeck
Hardware Designer
Tana is our hardware designer focusing on analysing mechanical stability and integrity of our product. Her background is in chemical engineering, however she has executed numerous extensive projects in mechanical engineering, prior to joining us.


Next: dotimes, Previous: Iteration Dictionary, Up: Iteration Dictionary
do
({var | (var [init-form [step-form]])}*)
(end-test-form {result-form}*)
{declaration}* {tag | statement}*
⇒ {result}*
do*
({var | (var [init-form [step-form]])}*)
(end-test-form {result-form}*)
{declaration}* {tag | statement}*
⇒ {result}*
var—a symbol.
init-form—a form.
step-form—a form.
end-test-form—a form.
result-forms—an implicit progn.
declaration—a declare expression; not evaluated.
tag—a go tag; not evaluated.
statement—a compound form; evaluated as described below.
results—if a return or return-from form is executed, the values passed from that form; otherwise, the values returned by the result-forms.
do iterates over a group of statements while a test condition holds. do accepts an arbitrary number of iteration vars which are bound within the iteration and stepped in parallel. An initial value may be supplied for each iteration variable by use of an init-form. Step-forms may be used to specify how the vars should be updated on succeeding iterations through the loop. Step-forms may be used both to generate successive values or to accumulate results. If the end-test-form condition is met prior to an execution of the body, the iteration terminates. Tags label statements.
do* is exactly like do except that the bindings and steppings of the vars are performed sequentially rather than in parallel.
Before the first iteration, all the init-forms are evaluated, and each var is bound to the value of its respective init-form, if supplied. This is a binding, not an assignment; when the loop terminates, the old values of those variables will be restored. For do, all of the init-forms are evaluated before any var is bound. The init-forms can refer to the bindings of the vars visible before beginning execution of do. For do*, the first init-form is evaluated, then the first var is bound to that value, then the second init-form is evaluated, then the second var is bound, and so on; in general, the kth init-form can refer to the new binding of the jth var if j < k, and otherwise to the old binding of the jth var.
At the beginning of each iteration, after processing the variables, the end-test-form is evaluated. If the result is false, execution proceeds with the body of the do (or do*) form. If the result is true, the result-forms are evaluated in order as an implicit progn, and then do or do* returns.
At the beginning of each iteration other than the first, vars are updated as follows. All the step-forms, if supplied, are evaluated, from left to right, and the resulting values are assigned to the respective vars. Any var that has no associated step-form is not assigned to. For do, all the step-forms are evaluated before any var is updated; the assignment of values to vars is done in parallel, as if by psetq. Because all of the step-forms are evaluated before any of the vars are altered, a step-form when evaluated always has access to the old values of all the vars, even if other step-forms precede it. For do*, the first step-form is evaluated, then the value is assigned to the first var, then the second step-form is evaluated, then the value is assigned to the second var, and so on; the assignment of values to variables is done sequentially, as if by setq. For either do or do*, after the vars have been updated, the end-test-form is evaluated as described above, and the iteration continues.
The remainder of the do (or do*) form constitutes an implicit tagbody. Tags may appear within the body of a do loop for use by go statements appearing in the body (but such go statements may not appear in the variable specifiers, the end-test-form, or the result-forms). When the end of a do body is reached, the next iteration cycle (beginning with the evaluation of step-forms) occurs.
An implicit block named nil surrounds the entire do (or do*) form. A return statement may be used at any point to exit the loop immediately.
Init-form is an initial value for the var with which it is associated. If init-form is omitted, the initial value of var is nil. If a declaration is supplied for a var, init-form must be consistent with the declaration.
Declarations can appear at the beginning of a do (or do*) body. They apply to code in the do (or do*) body, to the bindings of the do (or do*) vars, to the step-forms, to the end-test-form, and to the result-forms.
(do ((temp-one 1 (1+ temp-one)) (temp-two 0 (1- temp-two))) ((> (- temp-one temp-two) 5) temp-one)) ⇒ 4 (do ((temp-one 1 (1+ temp-one)) (temp-two 0 (1+ temp-one))) ((= 3 temp-two) temp-one)) ⇒ 3 (do* ((temp-one 1 (1+ temp-one)) (temp-two 0 (1+ temp-one))) ((= 3 temp-two) temp-one)) ⇒ 2 (do ((j 0 (+ j 1))) (nil) ;Do forever. (format t "~ (let ((item (read))) (if (null item) (return) ;Process items until NIL seen. (format t "~&Output ~D: ~S" j item)))) |> Input 0: |>>banana<<| |> Output 0: BANANA |> Input 1: |>>(57 boxes)<<| |> Output 1: (57 BOXES) |> Input 2: |>>NIL<<| ⇒ NIL (setq a-vector (vector 1 nil 3 nil)) (do ((i 0 (+ i 1)) ;Sets every null element of a-vector to zero. (n (array-dimension a-vector 0))) ((= i n)) (when (null (aref a-vector i)) (setf (aref a-vector i) 0))) ⇒ NIL a-vector ⇒ #(1 0 3 0)
(do ((x e (cdr x)) (oldx x x)) ((null x)) body)
is an example of parallel assignment to index variables. On the first iteration, the value of oldx is whatever value x had before the do was entered. On succeeding iterations, oldx contains the value that x had on the previous iteration.
(do ((x foo (cdr x)) (y bar (cdr y)) (z '() (cons (f (car x) (car y)) z))) ((or (null x) (null y)) (nreverse z)))
does the same thing as (mapcar #'f foo bar). The step computation for z is an example of the fact that variables are stepped in parallel. Also, the body of the loop is empty.
(defun list-reverse (list) (do ((x list (cdr x)) (y '() (cons (car x) y))) ((endp x) y)))
As an example of nested iterations, consider a data structure that is a list of conses. The car of each cons is a list of symbols, and the cdr of each cons is a list of equal length containing corresponding values. Such a data structure is similar to an association list, but is divided into "frames"; the overall structure resembles a rib-cage. A lookup function on such a data structure might be:
(defun ribcage-lookup (sym ribcage) (do ((r ribcage (cdr r))) ((null r) nil) (do ((s (caar r) (cdr s)) (v (cdar r) (cdr v))) ((null s)) (when (eq (car s) sym) (return-from ribcage-lookup (car v)))))) ⇒ RIBCAGE-LOOKUP
other iteration functions ( dolist, dotimes, and loop ) and more primitive functionality ( tagbody, go, block, return,
If end-test-form is nil, the test will never succeed. This provides an idiom for "do forever": the body of the do or do* is executed repeatedly. The infinite loop can be terminated by the use of return, return-from, go to an outer level, or throw.
A do form may be explained in terms of the more primitive forms block, return, let, loop, tagbody, and psetq as follows:
(block nil (let ((var1 init1) (var2 init2) ... (varn initn)) declarations (loop (when end-test (return (progn . result))) (tagbody . tagbody) (psetq var1 step1 var2 step2 ... varn stepn))))
do* is similar, except that let* and setq replace the let and psetq, respectively.
Next: dotimes, Previous: Iteration Dictionary, Up: Iteration Dictionary


| None. |
|
ShowPointer is for use in windowed display modes, and simply shows the Windows pointer after it's been hidden (via HidePointer). It has no effect in full-screen modes.
See also: HidePointer. |
|
; HidePointer / ShoPointer Example
; draw a simple screen, cut in half by a white line Graphics 800,600,0,2 Color 255,255,255 Line 400,0,400,600 Text 200,300,"ShowPointer",True,True Text 600,300,"HidePointer",True,True ; and a simple loop in which we hide / show the pointer dependent on ; which side of the screen the mouse is on! Repeat If MouseX()<400 Then ShowPointer Else HidePointer End If If KeyHit(1) Then Exit ; ESCAPE to exit Forever End ; bye! |


---
layout: post
title: Aperture 3 - Modifying A Batch Of Images
tags:
- Aperture 3
- Apple Aperture
- Articles
- lift and stamp
- multiple images
status: publish
type: post
published: true
meta:
_edit_lock: "1269529762"
tt_auto_tweet: "false"
aktt_notify_twitter: "yes"
_edit_last: "2"
tt_auto_tweet_text: "New blog post: [TITLE] [URL] "
aktt_tweeted: "1"
series_part: "7"
dsq_thread_id: "370198811"
---
Got some feedback on the first screencast already - some good and some bad. The good was that a viewer learned something that was not even on the topic of stacks and albums. The bad was that I should buy a better microphone. I will - I promise but first let's see if these things prove to be helpful.
I just wanted to share a tidbit from the first screencast that someone found very helpful. Now that I think of it I do see the question of how to apply adjustments to multiple images simultaneously come up on the Apple support forums a lot. I want to generalize adjustments to mean metadata - image adjustments - keywords - whatever.
Most people conclude that the "primary only" button is somehow broken in Aperture because adjustments or changes they apply only affect the primary in any group of selected images. Well it's not. There is a pretty simple rule to remember about how Aperture treats any modifications that you make to a group of images. Here it is:
If you use any of the inspectors to change the image - the metadata inspector, the adjustment inspector - in either the sidebar or the HUD those changes will only be applied to the primary - not the entire selection. If you use pretty much anything else like the menus, shortcut keys, or dragging a keyword from the keyword HUD to a group of selected images the changes will be applied to all the images unless the primary only button is active. Try it.
Of course you can always use lift and stamp as well. Here is a dissertation on the ups and downs of lift and stamp (forgive the pun)


This section is designed so that we can all share useful links or any useful information to progress on our path to being better developers.
For example we can share the following:
Useful websites for web developers, for example websites where you can find free icons, images, illustrations ...
Websites where one can learn to program for free.
Books that you have read or that you are reading.
Youtube channels.
Podcasts.
Platforms of code challenges.
Mobile apps.
Games.
The above are just examples, feel free to share what you think is helpful.
How can I share?
Enter the document Useful-links.html on the easyToGit Repo.
Each source type is wrapped in a div of class .list and all these divs are wrapped in a div of class .info-container
Inside the containers, we have an h3 (title of the section) and a ul with several li.
Within the li share your useful links along with a small description. Don't forget to put a website icon.
A short introduction to the command line for beginners.
To make your contributions correctly, we recommend that you watch the following video:
Useful websites
The Internet is full of useful webpages for developers, here we are going to name some that will make our way easier.
Freepik: free icons, images, illustrations...
PNGguru: free transparent images
Animate.css: add css animations easy
Soucerer: visualized github commits
Skillcrush: blog, career guides, tips
for beginners
Real python: articles, tutorials, exercises, tips
Easy to Git: get started Git, GitHub and collaborate with others
Shortcutfoo: learn short cuts and work smarter.
Websites to learn for free
To many it must happen of not having the resources to pay for a Courses, BootCamp or University Career. These websites teach for free, take advantage of the opportunity and that lack of resources is not an impediment.
FreeCodeCamp: Learn for free
Khan Academy: Learn for free
LearnToCodeWith.me: 81 websites to learn for free
Learn Python and other major programming languages
Online Courses
There are tons of online courses which teach web development at every level. Also, most of them are really cheap or even free! Here are the best of them:
The Web Developer Bootcamp 2.0
HTML, CSS, and Javascript for Web Developers
Books
Maybe sometimes skipping concepts, basic and not so much, is a good way to accelerate learning, but there are times when this has consequences and makes us get stuck in learning, in these cases it is best to take time to read a book relaxed .
Youtube channels
Do you want to know how to make a certain design? Do you want to see the theory you read in a book in action? The best way is to watch videos on Youtube, ATTENTION! You must put it into practice as well, but they will not do you any good.
Traversy Media: Programming tutorials
The Net Ninja: Programming tutorials
Academind: Programming tutorials
Stefan Mischook: Coding/Freelancing Advice
CS50: Free classes from Havard University
Podcasts
The best option to listen to counterpoints of different technologies and the direction of development.
CodePen Radio: The good, the bad, and the ugly.
CS50: different areas and topics
Platforms for code challenges
This may sound repetitive but you have to practice, practice, practice, practice ...
Codewars: Train to improve
Edabit: Code challenges & algorithms
Codingame: Improve your programming skills while having fun


We're launching soon
00
Days
00
Hours
00
Minutes
00
Seconds
Challenge by
Frontend Mentor
.
Coded by
Gustavo Campos
.


Studio Classroom’s 45th
anniversary
Sine 1962, StudioClassroom
has encouraged many diligent students to get up early in the
morning to study English. Studio Classroom started out as a radio
program with a printed 2-page handout, which soon developed into a
black and white twenty-page magazine. From there it expanded into a
three daily radio programs with three full-color magazines and an
accompanying English teaching television series. You can see that
Studio Classroom has changed a lot over the
years. Doris Brougham, the founder of Studio
classroom magazine and also the first English teacher on the Studio
classroom radio program remembers:
I got a tape recorder from
the United States. They were new at that time and recorded a
Chinese gossip program in my living room .I put the tape recorder
on my bicycle and took it to the radio station for
broadcast.
It is now 45 years later
and StudioClassroom is still around to help people of all ages
improve their English. In order to continue to meet the need for
everyday English conversation skills, StudioClassroom added another
magazine to its family, called let’s talk in English, in 1981.And
then in 2003 , the advanced section of StudioClassroom split off
into a new magazine to meet the needs of its high level English
readers. The three magazines continue to provide appropriate
support to learners at all levels. But StudioClassroom didn’t stop
there; it became a pioneer in its field by using different forms of
mass media to provide additional learning help. In 1997
Studioclassroom put its own TV program on the air .and it became
the first English teaching program broadcast on both radio and
television everyday. Fast forward a few years, studio classroom is
still using the latest technology; students can now use the
internet ,cell phones ,ipods ,television and of course radio to
enjoy the Studioclassroom program wherever they are. Through all
these forms of media, learners of English from all over the world
can now make use of StudioClassroom.
As a result of its
educational excellence, Studioclassroom has won numerous awards,
including the Golden Tripod Award. These awards given to
Studioclassroom affirmed fine quality of its production.
Studioclassroom teachers, together with heavenly melody and
sunshine singers visit schools to conduct English workshops.
Through English activities music and drama, students learn to use
English in a natural way and receive a positive influence in their
lives.
Your friend for life,
Studioclassroom works hard to make a difference in your English
learning and in your life.
Join us! You can make a
difference too!


Send on Matic
Instructions
- Click "Connect", and then try 'Sending tx on Matic'.
- Please note that:
- The button 'Send tx on Matic', switches RPC and sends a sample tx on Matic chain.
-
The Snap package.json must be located in located in the server root directory
-
The Snap bundle must be hosted at the location specified by package.json:web3Wallet:bundle:url


There are a number of Perforce APIs out there... P4Ruby, P4Python, P4Perl, and P4COM are some of the most popular. My goal was to make P4.Net as similar as possible to these. In general, if you're familiar with the Ruby/Python/Perl APIs, you'll be able to transition to P4.Net fairly quickly. The biggest conceptual difference is that those APIs are used in dynamic languages, and P4.Net targets static languages. As a result, P4.Net uses custom types where the other APIs use built-in types, and P4.Net will use separate methods/properties to distinguish actions that output different types.
Let's just dive into a sample, and do a side-by-side comparison. In this case, I'll compare P4.Net using IronPython to P4Python using standard Python. Note, I don't mean to suggest that P4.Net/IronPython is superior to P4Python/Standard Python, I just want to show apples-to-apples comparisons, without interference from individual language features.
| # Standard Python and P4Python | # IronPython and P4.Net | ||
| import clr | |||
| 1 | from System import Array, String | ||
| clr.AddReferenceToFile('P4API.dll') | |||
| import p4 as P4API | import P4API | ||
| p4 = P4API.P4() | p4 = P4API.P4Connection() | ||
| 2 | p4.parse_forms() | ||
| p4.connect() | p4.Connect() | ||
| lname = 'P4NetTestingSample' | lname = 'P4NetTestingSample' | ||
| # build my label | # build my label | ||
| labelForm = p4.fetch_label(lname) | labelForm = p4.Fetch_Form('label', lname) | ||
| labelForm['Description'] = 'Created for P4.Net sample' | labelForm['Description'] = 'Created for P4.Net sample' | ||
| 3 | view = ['//guest/shawn_hladky/...'] | view = Array[String](['//guest/shawn_hladky/...']) | |
| labelForm['View'] = view | labelForm.ArrayFields['View'] = view | ||
| res = p4.save_label(labelForm) | res = p4.Save_Form(labelForm) | ||
| 4 | if len(p4.errors) > 0: | if res.HasErrors(): | |
| for e in p4.errors: print e | for e in res.Errors: print e | ||
| # My list of changes. This is totally arbitrary | # My list of changes. This is totally arbitrary | ||
| changes=['5774', '5680', '5636', '5444'] | changes=['5774', '5680', '5636', '5444'] | ||
| sorted_changes = changes.sort() | sorted_changes = changes.sort() | ||
| # dictionary: keyed by file, value = revision | # dictionary: keyed by file, value = revision | ||
| filerevs = {} | filerevs = {} | ||
| # spin the description on each file | # spin the description on each file | ||
| 5 | for chg in p4.run_describe('-s', *changes): | for chg in p4.Run('describe', '-s', *changes): | |
| 6 | depotFiles = chg['depotFile'] | depotFiles = chg.ArrayFields['depotFile'] | |
| revisions = chg['rev'] | revisions = chg.ArrayFields['rev'] | ||
| for i in range(0, len(depotFiles)): | for i in range(0, len(depotFiles)): | ||
| key,value = depotFiles[i], revisions[i] | key,value = depotFiles[i], revisions[i] | ||
| filerevs[key]=value | filerevs[key]=value | ||
| # convert the dictionary to a list | # convert the dictionary to a list | ||
| flist = [] | flist = [] | ||
| for k,v in filerevs.items(): | for k,v in filerevs.items(): | ||
| flist.append("%s#%s" % (k,v)) | flist.append("%s#%s" % (k,v)) | ||
| # now I want to run in non-parsed mode | |||
| p4.disconnect() | |||
| p4 = P4API.P4() | |||
| 7 | p4.connect() | ||
| out = p4.run('labelsync', '-l', lname, *flist) | out = p4.RunUnParsed('labelsync', '-l', lname, *flist) | ||
| for s in out: print s | for s in out: print s | ||
| # delete the label to keep the public depot clean :-) | # delete the label to keep the public depot clean :-) | ||
| p4.run('label', '-d', lname) | p4.RunUnParsed('label', '-d', lname) | ||
| p4.disconnect() | p4.Disconnect() |
This is some overhead required for IronPython. It will load the CLR, and P4.Net.
This chunk of code is establishing a connection to the Perforce server. There are a couple things unique to P4.Net worth noting here. Classes in P4.Net are more explicitly named. Here the connection class is named P4Connection. While we're talking about naming, P4.Net uses traditional .Net conventions, and all method names use camel case.
Also, note that P4.Net does not need the parse_forms() method. P4.Net is designed to be more statically typed than P4Python/P4Ruby/P4Perl. You use different methods to retrieve tagged vs. untagged output. Therefore, P4.Net auto-manages the connection, and will dynamically switch modes in the native C++ API when needed.
There's several things going on in this chunk, so let's break it down line-by-line:
P4Python: labelForm = p4.fetch_label(lname) P4.Net : labelForm = p4.Fetch_Form('label', lname)
Since P4.Net isn't meant for dynamic languages, there are no shortcut methods available.
P4Python: labelForm['Description'] = 'Created for P4.Net sample' P4.Net : labelForm['Description'] = 'Created for P4.Net sample'
Identical syntax!
P4Python: view = ['//guest/shawn_hladky/...'] P4.Net : view = Array[String](['//guest/shawn_hladky/...'])
IronPython doesn't explicitly convert Python lists to .Net Arrays.
P4Python: labelForm['View'] = view P4.Net : labelForm.ArrayFields['View'] = view
In P4.Net, you use the ArrayFields property when getting/setting fields with array values.
P4Python: res = p4.save_label(labelForm) P4.Net : res = p4.Save_Form(labelForm)
There's no shortcut methode available in P4.Net; however, sine the form is a rich object, it already knows the command, and doesn't need to be supplied with the Save_Form method.
This is a subtle, but significant departure from the other APIs. In P4.Net, results are rich objects, not just simple lists. All warnings, errors, and messages are associated with the results object. In other APIs, these are part of the connection object, and are reset with each run.
More of the same... no short-cut methods, and use the ArrayFields property. Only in this instance we're dealing with a P4Recordset instead of a form.
In P4.Net, you use different methods to return tagged and untagged output. This means P4.Net auto-manages the connection for you, so no need to explicitly reset as other APIs require.


DomainTrustExplorer
Python script for analyis of the "Trust.csv" file generated by Veil PowerView. Provides graph based analysis and output. The graph output will represent access direction (opposite of trust direction)
Tested on Mac OSX with yEd for visualization.
Parsing colors and labels in yEd (GraphML):
-Edit->Properties Mapper
-Add a configuration for node
-Add a mapping for label/Label Text
-Add a configuration for edge
-Add a mapping for color/Line Color
Setup & Requirements
pip install networkx
trust_explorer.py (csvfile)


{% extends "base.html" %} {% block title %}Writing for Software Developers{% endblock %} {% block twitter %} {% endblock %} {% block head %} {% endblock %} {% block content %}
In my first year of writing technical content, I reached hundreds of thousands of readers around the world, met some of my role models, and made thousands of dollars. Writing for Software Developers will help you on your way to doing the same.
I earn $250 to $500 per article when writing tutorials — and with a few projects, that money adds up. But money isn't the only reason to write. A portfolio of published writing can give you a leg up toward earning a raise, landing a new job, or reaching new clients or customers.
Writing for Software Developers outlines my own method for writing and developing technical articles that will earn you money and look great in a portfolio. By following the principles in this book, you will become a better writer — and practicing quality techniques like these will speed up your rate of improvement.
Writing for Software Developers focuses on teaching you how to envision, create, and publish mid-length technical tutorials and articles, but the principles and practices you’ll develop will help you write anything from a short README to an entire technical book. And regardless of why you write, this guide aims to provide you with the techniques you will need to reach your goals.
Single Copy: $36 | Team License: $136
New: Writing for Software Developers now supports purchase power parity. This dynamically applies location-based discounts based on GDP and currency conversion rates.
Click here to see if a PPP discount applies to your purchase.
Over 1,000 copies sold with a 5-star rating on Gumroad. More ratings & reviews on Goodreads.
You will be redirected to Gumroad to complete your purchase.
Courtland Allen is the founder of Indie Hackers, an online community for people working on independent bootstrapped businesses, of which I am proud to count myself as a member. Indie Hackers, now owned by Stripe, has been a source of knowledge and inspiration to me throughout the process of writing this book. Allen has interviewed over five hundred founders for his site and podcast.
Jeff Atwood is the writer of Coding Horror (one of the internet's longest-running and most popular technical blogs), co-founder of Stack Overflow and the Stack Exchange network (one of the 100 highest-traffic sites in the United States), and co-founder of Discourse (a provider of open-source forum software aiming to improve the state of online communication).
Chris on Code started scotch.io with his childhood friend Nick Cerminara to publish articles and courses on front-end development. Under his care, the site grew to four million monthly page views and published over five hundred guest authors before he sold Scotch to Digital Ocean in late 2019. He joined the company as a web community manager.
Peter Cooper runs Cooper Press, a publisher of a dozen email newsletters with a combined distribution of almost half a million developers at the time of writing. He reads countless technical articles in search of the best content to share with his subscribers.
Angel Guarisma eats, sleeps, and breathes documentation. At the time of our interview, he was the Director of Content at Linode, a cloud computing company with a major presence in the open source community. He now works as the Director of Product Education at Humio. At Linode, Guarisma led an in-house team of technical writers and editors and works with numerous freelancers to publish wide-ranging and comprehensive tutorials and documentation.
Matt Levine is a columnist at Bloomberg where he writes Money Stuff, an incredibly popular weekday newsletter on finance that is widely read in the tech sector. Previously, he wrote at Dealbreaker, and he has written for The Wall Street Journal, CNN.com, and NPR. While his substantial experience is entirely outside writing about software, his techniques and insights are applicable to the work we do.
Mark McGranaghan created Go by Example, a website for teaching the programming language Go. Go by Example drew attention for its two-column design and quality example code. Today, he works at Ink & Switch, a research lab that produces reports and spin-off companies in consumer software.
Patrick McKenzie has been writing on his website, kalzumeus.com, since 2006. He has written over five hundred articles about lessons learned working on Bingo Card Creator, Appointment Reminder, and Starfighter, consulting for software companies on engineering and marketing, and most recently working on Atlas for Stripe. He is also the third highest-ranked user of all time by upvotes on Hacker News.
Tracy Osborn is a writer and conference speaker. She has published three books under the "Hello Web" series: Hello Web App, Hello Web App Intermediate Concepts, and Hello Web Design. She is a frequent speaker at numerous events, writes extensively on her personal website, and currently works at TinySeed.
Daniel Vassallo worked at AWS for eight years. After quitting to work for himself, one of the first things he created was the self-published ebook The Good Parts of AWS, with Josh Pschorr. Thanks in large part to Vassallo's audience on Twitter, which he earned by sharing detailed insights into his work, the book sold thousands of copies in its first three months on the market, generating over $50,000 in revenue.
Cassidy Williams has spent years working in developer evangelism, speaking at dozens of conferences, and writing technical content, including the Stack Overflow newsletter. At the time of the interview, she taught with React Training. She now works at Netlify. She publishes a weekly newsletter, rendezvous with cassidoo.
This chapter guides you through a process for generating article ideas and helps you determine which ideas are worth pursuing first.
Single Copy: $36 | Team License: $136
New: Writing for Software Developers now supports purchase power parity. This dynamically applies location-based discounts based on GDP and currency conversion rates.
Click here to see if a PPP discount applies to your purchase.
You will be redirected to Gumroad to complete your purchase.
In Spring 2019, I started writing technical tutorials. After noticing my success publishing tens of thousands of words of technical content, friends and co-workers started asking me how they could do the same. Their interest inspired me to write this book. Today, I'm a technical writer at BaseTen.
I published Writing for Software Developers on May 12, 2020, six days before my virtual college graduation ceremony, where I received a B.A. with honors in computer science from Grinnell College. I now live in Washington DC. When I am not writing and programming, I practice martial arts, read widely, and further my love of the Marvel Cinematic Universe.
For more about me, check out the rest of my website.
Yes. Writing for Software Developers takes you through my process, one step at a time, and helps you create and publish your first article.
Yes. If you have already written and published technical content, you will enjoy the nuances of the eleven expert interviews and extract key insights from the main text.
Not as much as you might think. I started writing technical content as a junior in college, less than two years after I started programming. Many of the code examples I used in articles were based on projects that I had worked on much earlier in my journey toward becoming a software engineer.
If enough people express interest, I will figure out how to make one available.
Yes! Your purchase of Writing for Software Developers includes an audiobook version narrated by Griffin Mareske. The audiobook is 6 hours and 35 minutes long and does not include the appendices, images, or code snippets.
If you purchase an individual license, please respect the license terms and do not distribute any copies. If you want to share the book with your team, company, or class, please purchase a team license. Academic and nonprofit organizations can contact me for fifty percent off a team license.
I have a 30-day no-questions-asked refund policy. If you don't like it, let me know and I will refund your money.
Yes! For some locations, discounts between 20% and 60% are automatically applied at checkout based on GDP and conversion rates. Learn more
I priced this book as I did because it teaches valuable skills in a well-compensated industry. If you are unable to afford a copy of the book, send me an email and I can give you a free copy. I only ask that once you make money using the advice in the book, you use a portion of the proceeds to purchase a copy of this book.
Wow, thanks for asking! Writing for software engineers. Writing for programmers. Writing for coders. Technical writing. How to write documentation.
Send me an email at<EMAIL_ADDRESS>Single Copy: $36 | Team License: $136 | PPP discounts available
You will be redirected to Gumroad to complete your purchase.
Without Amazon, I retain ~90% of your purchase after fees (versus 35% with Amazon), which allows me to pay my rent and operate my business.
Thank you for your support!
Listen to "Episode 426: Philip Kiely on Writing for Software Developers" on Software Engineering Radio, hosted by Jeff Doolittle and produced by IEEE.
We discuss "why software engineers should care about writing things other than code.... the elements of effective technical writing and technical writers.... [and] the reason for the book and the approach for writing it."


Hi! This is the documentation site for the VOICE project. From here, you can use the toolbar menu to explore the project documentation and get help on using VOICE. If you want to return to the VOICE application, use the VOICE link in the toolbar.
Copyright © 2017 Charles Little, All rights reserved.


We're sorry but web-components-in-vue doesn't work properly without JavaScript enabled. Please enable it to continue.


#include <beeplisten.h>
Public Attributes | |
| srObjID | OID |
| object ID | |
| sbSockObject * | pSockListening |
| our own listening socket | |
| sbNVTRObject * | pRootSessions |
| this server's active sessions | |
| sbNVTRObject * | pProfsSupported |
| list of supported profiles | |
| char * | szListenAddr |
| IP address the server should bind to - NULL means no specific address. | |
| unsigned | uListenPort |
| port the server should bind to | |
| int | bRun |
| run indicator for server | |
| int | bLstnBEEP |
| should we listen to BEEP (RFC3195)? | |
| srAPIObject * | pAPI |
| pointer to our API Object |
Implemented via beeplisten::h and beeplisten::c.
|
|
run indicator for server If set to FALSE, server will terminate |


| Holy | And | Anointed | One | - | 聖 潔 | 受 | 膏 | 者 | |||
| Holy | And | Anointed | One | - | shèng jié | shòu | gāo | zhě | |||
| Holy | And | Anointed | One | - | Holy | receive | grease | he who |
John Barnett
Jesus, Jesus
耶 穌 | 耶 穌 | ||
yē sū | yē sū | ||
| Jesus | Jesus |
Holy and Anointed One
祢 | 是 | 聖 潔 | 受 | 膏 | 者 | ||
ní | shì | shèng jié | shòu | gāo | zhě | ||
| you | is | Holy | receive | grease | he who |
Jesus
耶 穌 | ||
yē sū | ||
| Jesus |
Jesus, Jesus
耶 穌 | 耶 穌 | ||
yē sū | yē sū | ||
| Jesus | Jesus |
Risen and Exalted One
復 活 | 主 | 配 | 受 | 尊 崇 | ||
fù huó | zhǔ | pèi | shòu | zūn chóng | ||
| resurrection | master | match | receive | Respected |
Jesus
耶 穌 | ||
yē sū | ||
| Jesus |
Your name is like honey on my lips
祢 | 聖 名 | 真 | 甜 蜜 | 滿 | 我 | 口 | ||
ní | shèng míng | zhēn | tián mì | mǎn | wǒ | kǒu | ||
| you | Holy name | real | sweet | fill | I | mouth |
Your Spirit like water to my soul
祢 | 聖 靈 | 像 | 活 水 | 充 滿 | 我 | ||
ní | shèng líng | xiàng | huó shuǐ | chōng mǎn | wǒ | ||
| you | The Holy Spirit | image | running water | full | I |
Your Word is a lamp unto my feet
祢 | 話 語 | 是 | 我 | 腳 | 前 | 的 | 燈 | ||
ní | huà yǔ | shì | wǒ | jiǎo | qián | de | dēng | ||
| you | Discourse | is | I | foot | forward | of | lantern |
Jesus, I love You, I love You
耶 穌 | 我 | 愛 | 祢 | 我 | 愛 | 祢 | ||
yē sū | wǒ | ài | ní | wǒ | ài | ní | ||
| Jesus | I | love | you | I | love | you |


- Frame Rate
- Refresh Rate
- How They Function Together
- Syncing Refresh Rate and Frame Rate
- Does Refresh Rate Matter for Gaming?
When you look at buying or building a new gaming computer, more often than not you’ll conduct a little research to figure out what kind of performance you can expect from game to game.
You might’ve also noticed a variable shown on monitors’ boxes known as refresh rate, or heard people talking about the refresh rate of their monitor.
So what the hell is this thing, what’s the difference between refresh rate and frame rate, and why should it matter to you at all?
Frame Rate
Video, in any form, down to its most simple level is just a ton of still pictures put together to simulate movement to the human eye. This is the process that allows GPUs to be able to display that YouTube video you may be watching or the Call of Duty game you might be playing (yeah, right).
You’ll see the words “frame rate” used a lot when graphics cards manufacturers are revealing their next best project at events and comparing it to competitors.
Frame Rate, most often referred to as FPS (Frames Per Second), is just the measure of how many pictures, or frames, can be rendered by your graphics card in a 1 second timeframe.
So naturally, the higher your computer’s frame rate, the smoother the final product will be. After a certain point, you can’t see a difference between, say, 60fps and 120fps – this is where refresh rate comes in.
Refresh Rate
Refresh rate is very similar to frame rate.
There’s a slight difference between them, though. Basically, refresh rate is a measure of how many frames per second your monitor can handle. In other words, how many times the monitor can refresh its screen in one second.
Unlike with frame rate (measured in frames per second), refresh rate is measured in Hertz (Hz). Hertz, in short, is just a frequency unit that measures a cycle per second; so it might as well be frames per second.
How They Function Together
Frame rate and refresh rate do actually work together, and both have a hand in delivering the gaming performance that you’re expecting from your rig.
Just think of it like this:
You have a graphics card that can run Minecraft at 60fps and your monitor runs at a refresh rate of 60Hz, so you’ll get 60 frames per second.
Now, let’s say your graphics card runs Minecraft at 120fps, but your monitor is only rated for a 60Hz refresh rate.
In this case, you won’t be getting that full 120fps value out of your GPU since your monitor can only go so fast.
So, generally, if you want to run higher and higher frame rates, you need to purchase a high refresh rate monitor to keep up with your beastly performance.
We should also note that sometimes reaching very high frame rates on low refresh rate monitors can cause graphical glitches like tearing, but we can remedy that in the next section.
Syncing Refresh Rate and Frame Rate
GPU manufacturers have wanted a way to sync together the frame rate of graphics cards and the refresh rate of monitors to give users the smoothest possible performance while leaving no frame behind.
The solution, from Nvidia, was Nvidia G-Sync. Nvidia’s G-Sync enabled monitors to work alongside G-Sync compatible graphics cards to sync the rate for both.
GPUs like the GTX 1080 and 1080 Ti are great examples of G-Sync coming in handy, since they both deliver very high performance (FPS).
However, using G-Sync forces the GPU to run at a lower frame rate, which can be an issue with lower-end graphics cards.
Oh, and G-Sync only works with Nvidia cards – bummer.
AMD also has its version, called AMD Free Sync. AMD’s Free Sync further improved upon the syncing technology while also allowing both Nvidia and AMD cards the privilege of utilizing the software.
If you’d like to learn more about the differences between G-Sync and Free Sync, we explained it here in our article on the best monitors for the Nvidia GTX 1080 Ti.
Does Refresh Rate Matter for Gaming?
Well, the answer to that depends on who the target audience is, really.
For example, say you’re just trying to have fun playing a new adventure game or something of the sort.
All you really do is wander around, fight things, collect loot, and stare into the beautiful scenery.
Think about it, do you actually benefit from having a slightly smoother experience?
60 frames per second is a generally accepted baseline for smooth gameplay across the board, and all you really need to support your 60fps gameplay is a generic 60Hz monitor.
Though, it may also be slightly beneficial to have a bit of headroom with a 75Hz monitor so that your frames never dip below that 60 mark.
On the other end of the scale, we have professional and online competitive gamers.
In the case of competitive and professional play, every single extra frame you have could contribute to life or death when gaming.
In this case, having a low refresh rate can be detrimental.
But don’t go thinking you just need a quick monitor to perform better in competitive play. Factors like your internet speed and the DPI (dots per inch) of your mouse can be just as important.
Especially that mouse thing, imagine trying to aim with low sensitivity, sheesh, try picking some poor sop in CS:GO when your mouse moves like its submerged in molasses.


|
|
char | on |
| |
|
char | tmp_flag |
| |
|
char | uniqID [15] |
| |
|
char | iCode |
| |
|
char | resName [4] |
| |
|
int | resSeq |
| |
|
char | chainID |
| |
|
char | altLoc |
| |
|
char | confID [4] |
| |
|
int | iConf |
| |
|
char | confName [6] |
| |
|
float | netcrg |
| |
|
float | pKa |
| |
|
float | Em |
| |
|
float | E_torsion |
| |
|
float | E_vdw0 |
| |
|
float | E_vdw1 |
| |
|
float | E_epol |
| |
|
float | E_tors |
| |
|
float | E_rxn0 |
| |
|
float | E_rxn |
| |
|
float | E_extra |
| |
|
float | E_dsolv |
| |
|
float | E_ph |
| |
|
float | E_eh |
| |
|
float | E_mfe |
| |
|
float | E_self0 |
| |
|
float | E_TS |
| |
|
double | E_self |
| |
|
float | occ |
| |
|
int | e |
| |
|
int | H |
| |
|
char | history [12] |
| |
|
int | counter |
| |
|
int | n_atom |
| |
|
ATOM * | atom |
| |
|
int | nrg_idx |
| |
|
int | on_atoms |
| |
|
int * | on_atm_idx |
| |
|
VECTOR | r_min |
| |
|
VECTOR | r_max |
| |
|
int | i_res_prot |
| |
|
int | i_conf_prot |
| |
|
int | i_conf_res |
| |
|
int | i_conf_subres |
| |
|
int | subresID |
| |
|
int | i_subres_res |
| |
|
float | tmp_pw_ele |
| |
|
float | tmp_pw_epol |
| |
|
float | tmp_pw_vdw |
| |
|
float | sas |
| |
|
float | sas_fraction |
| |
|
int | counter_E |
| |
|
float | occ_old |
| |
|
char | toggle |
| |
|
float * | occ_table |
| |
|
int | counter_trial |
| |
|
int | counter_accept |
| |
|
float | real_occ |
| |
|
float | PE_TS |
| |
The documentation for this struct was generated from the following file:


It's theoretically possible to beat Minecraft without picking up a single item
by Rob BeschizzaIn this video, an astoundingly dedicated player demonstrates how to complete Minecraft without ever picking up an item.
It requires an example of unbelievable luck -- an End Portal which already has 12 eyes in it -- and some save scumming to beat the Ender Dragon with one's fists.
Here's the embed, via Reddit:
Beating Minecraft with no items from r/nextfuckinglevel


Bruno Latour
A philosophical perspective on how materiality projects onto thinking. Good for forcing debate at some point.


IB Physics
Syllabus
Notes
Booklets
IA/EE/TOK Ideas
Books
Videos
Calculator
About
Syllabus
Press Below
Download


{% trans "Red Panda Story" %}
{% trans "Nice, you just found a hidden link!" %}🤫🙂
{% trans "We wanted a cute main character. So we were between a Sloth and a Red Panda. After a few tries of making them both, we decided for the Sloth. But we didn't want leave Red Panda out, so we including him as well every time we can." %}
{% trans "At first, picking Sloth instead of Red Panda, affected their friendship..." %}
{% trans "Nowadays, their friendship is back. They go out to drink together and all that stuff." %} 🐼🦥


Logged in as
Below are the basic token details retrieve from the server on a successful login.
Access Token:
Access Token Expiry Time:
Scope:
Token Type:
Refresh Token:
View IDToken
Logout


Extensions
The following extensions are available globally.
-
Declaration
Swift
extension String: Enrichable
-
Declaration
Swift
extension Bundle
-
Declaration
Swift
extension JSONDecoder
-
A custom decoding for a date.
See moreDeclaration
Swift
extension JSONEncoder
-
Declaration
-
Declaration
Swift
extension Foundation.ISO8601DateFormatter: ISO8601DateFormatter
-
Declaration
Swift
extension Result
-
Declaration
Swift
extension Swime
-
Declaration
Swift
extension ReactionKind


{% extends "startupconfort/base.html" %} {% load humanize %} {% load hitcount_tags %} {% block content %}
500 An Error Occured. The webpage that you are looking for doesn't exist


b e a t r i c e a i s p u r o |
|||
07.16.08 Thank you for the opportunity to meet yesterday to discuss your web design projects. I checked your site hasleyhomes.com today and it was incredibly slow on my machine as well. I am on a Mac G5 dual processor, which is a very fast machine. I uploaded the web site sample that I recently did for a non-paying client. Click on this link. It will probably be the layout for joeDL.com. Like I mentioned yesterday, I bill by the hour ($45/hr) and estimated the cost (pkgs) for your house listing galleries/collages to run at $500 for basic 1-2 page site, $750 for med. 3-4 page site, and around $1500 for deluxe site like casa121. The cost will depend on the time and number/quality of photos. These estimates were not intended for your more complex site. Since I do not know how involved hasleyhomes.com will be yet, I can't give you a more precise figure, but estimate that it could run between $2500-3500. Of course, all of my work is bright, colorful, intuitively organized, and sure to engage your viewers. This would set you apart from your competitors and never need a redesign because it will be built to your satisfaction. I looked on the godaddy website for the domain halseyhomes.com, but unfortunately it is taken. Since many many people might misspell your name, it would have been a good idea to buy the misspelled name and mirror it as we discussed. I am having trouble keeping it straight myself, so I can imagine that it is a problem. It's not too late to look at other options for future campaigns; at $10/yr per domain, it's worth securing new ones before they are taken because once they are gone, they're gone! Since you requested a copy of my resume, I will include some background information on me. I received my Bachelor of Arts degree from California State University, Long Beach in Journalism, Public Relations, and Spanish in 1991 and completed coursework at Art Center College of Design in 1997. Throughout my fifteen-year career, I have been involved in the planning and management of hundreds of outstanding design and outreach projects. I have extensive experience designing print and web collateral and re-branding corporate identities. I have developed successful marketing and outreach campaigns, and produced numerous web sites. In addition to superior research and analytical skills, I am capable of managing multiple projects and delivering quality work while meeting deadlines successfully. As the first webmaster and designer at Caltech, I collaborated extensively with staff and faculty in creating and developing promotional material, both online and in print. I served as designer and editor of the original Caltech Alumni Newsletter, supervised staff and also taught classes in design. Also, as a native Spanish speaker, I translated documents and facilitated bilingual discussions for geologists conducting research in Mexico. I have also translated into Spanish many web sites for Shopsports.com and VictorySweepers.com. I believe my design skills and effective communication skills will be a valuable asset to your group. You mentioned possible teaching opportunities with your colleagues and I am very interested. Thanks again, I look forward to meeting with you on July 30 at 1pm. Sincerely, |
|||
:: cv |
|||
| :: local site designs | White
Tiger Printing Victory Sweepers, Inc. |
||


| Class name |
Method name |
Groups |
| compbio.engine.client.CommandBuilderTester |
| |
| @Test |
| |
testOptionsToCommand |
|
| |
testSpaceDelimiterExecutable |
|
| |
testCommandBuilding |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.NetNglycTester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.EngineConfiguratorTester |
| |
| @Test |
| |
testGetAsyncEngine |
|
| |
testGetSyncEngine |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.disorder.GlobPlotTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.stat.collector.ExecutionStatCollectorTester |
| |
| @Test |
| |
testHasCompleted |
|
| |
testHasTimedOut |
|
| |
testCollectStat |
|
| |
testUpdateStatTester |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.local.AsyncLocalRunnerTester |
| |
| @Test |
| |
testCancelLocally |
engine |
| |
testMultipleCancelLocally |
engine |
| |
testAsyncCancelOperation |
engine |
| |
testAsyncRetrievOperation |
engine |
| |
testSubmitLocally |
engine |
| |
testCancelCompletedTaskLocally |
engine |
| |
testGetStatus |
engine |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.MafftTester |
| |
| @Test |
| |
testExecute |
runner non_windows |
| |
testRunOnClusterAsyncCheckStatusShortPoolingTime |
cluster runner non_windows |
| |
testPersistance |
runner non_windows |
| |
testClusterExecute |
cluster runner non_windows |
| |
testSetInputTester |
runner non_windows |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner non_windows |
| |
testRunOnClusterAsyncCheckStatusLongPoolingTime |
cluster runner non_windows |
| @BeforeClass |
| @BeforeMethod |
| |
init |
cluster runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.data.sequence.ClustalAlignmentUtilTester |
| |
| @Test |
| |
testReadClustalFile |
|
| |
testReadClustalFileLongNames |
|
| |
testReadClustalFileShortNames |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.disorder.IUPredTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testReadResults |
runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testSetParameter |
runner |
| |
testConfigurationLoading |
runner |
| |
testRunLocally |
runner |
| |
testRunLocallyWithParams |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.engine.client.PathValidatorTester |
| |
| @Test |
| |
testIsAbsolutePath |
|
| |
testGetClassPath |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.stat.collector.StatDBTester |
| |
| @Test |
| |
testReadOneMonthData |
|
| |
testVerifyJobsCount |
|
| |
testReadYearData |
|
| |
testGetEarliestRecord |
|
| @BeforeClass |
| |
init |
|
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.stat.servlet.util.StatCollectionTester |
| |
| @Test |
| |
testGetStats |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.cluster.drmaa.DrmaaAsyncClusterEngineTester |
| |
| @Test |
| |
testSubmit |
engine cluster |
| |
testCancel |
engine cluster |
| |
testGetJobStatus |
engine cluster |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.cluster.drmaa.DrmaaClusterEngineTester |
| |
| @Test |
| |
testSubmit |
engine cluster |
| |
testCancel |
engine cluster |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.conservation.AAConTester |
| |
| @Test |
| |
testRunOnCluster |
runner |
| |
testRunLocallyWithPreset |
runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testRunLocallyOnTwoCpu |
runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.RPSBlastTester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| |
testGetTestArgsCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.PulledFileCacheTester |
| |
| @Test |
| |
test |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.disorder.DisemblTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.MclTester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.cluster.dundee._QueueTester |
| |
| @Test |
| |
testQueue |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.LoadBalancerTester |
| |
| @Test |
| |
testLoadBalance |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.ProbconsParametersTester |
| |
| @Test |
| |
testConstrainedParametersMaxValues |
runner non_windows |
| |
testConstrainedParametersRandomValues |
runner non_windows |
| |
testConstrainedParametersMinValues |
runner non_windows |
| |
testArguments |
runner non_windows |
| |
testOptions |
runner non_windows |
| |
testDefaultParameters |
runner non_windows |
| |
testParameters |
runner non_windows |
| |
testConfiguration |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.metadata.RunnerConfigTester |
| |
| @Test |
| |
testValidateUpperBoundaryConstrainCheck |
|
| |
testOptionSetInvalidValue |
|
| |
testValidateBoundaryConstrainCheck |
|
| |
testValidateValueConstrain |
|
| |
testCreateParameterWithValidValueConstrain |
|
| |
testValidateLowerBoundaryConstrainCheck |
|
| |
testOptionNoDefaultValidate |
|
| |
testCreateParameter |
|
| |
testOptionToCommand |
|
| |
testParameterToCommand |
|
| |
testCreateNumParameterWithoutValidValue |
|
| |
testValidate |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner.disorder.JronnTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testRunLocallyOnTwoCpu |
runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.MafftParametersTester |
| |
| @Test |
| |
testConstrainedParametersMaxValues |
runner non_windows |
| |
testConstrainedParametersRandomValues |
runner non_windows |
| |
testConstrainedParametersMinValues |
runner non_windows |
| |
testArguments |
runner non_windows |
| |
testOptions |
runner non_windows |
| |
testDefaultParameters |
runner non_windows |
| |
testParameters |
runner non_windows |
| |
testPresets |
runner non_windows |
| |
testConfiguration |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.RonnTester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.ProbconsTester |
| |
| @Test |
| |
testExecute |
runner non_windows |
| |
testPersistance |
runner non_windows |
| |
testClusterExecute |
cluster runner non_windows |
| |
testSetInputTester |
runner non_windows |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner non_windows |
| @BeforeClass |
| @BeforeMethod |
| |
init |
cluster runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.engine.conf.PropertyHelperManagerTester |
| |
| @Test |
| |
testClusterEngineConf |
cluster |
| |
validateClustalConfiguration |
|
| |
validateTcoffeeConfiguration |
|
| |
validateMuscleConfiguration |
|
| |
validateMafftConfiguration |
|
| @BeforeClass |
| |
testLoadResources |
|
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.metadata.OptionCombinatorTester |
| |
| @Test |
| |
testgetAllParameters |
|
| |
testgetAllOptions |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
|
| @AfterMethod |
| @AfterClass |
| compbio.engine.FilePullerTester |
| |
| @Test |
| |
testGet |
|
| |
testCache |
engine |
| |
testGetDelay |
engine |
| |
testPull |
engine |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.MuscleTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testPersistance |
runner |
| |
testRunOnClusterAsync |
cluster runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| |
init |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.TcoffeeTester |
| |
| @Test |
| |
testExecute |
runner non_windows |
| |
testPersistance |
cluster runner non_windows |
| |
testNcore |
runner non_windows |
| |
testClusterExecute |
cluster runner non_windows |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner non_windows |
| @BeforeClass |
| @BeforeMethod |
| |
init |
cluster runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.OBTester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| |
testGetTestArgsCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.LimitTester |
| |
| @Test |
| |
testLimitExceeded |
|
| |
testLoadLimits |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner |
| @AfterMethod |
| @AfterClass |
| compbio.engine.local.LocalRunnerTester |
| |
| @Test |
| |
testCancelLocally |
engine |
| |
testMultipleCancelLocally |
engine |
| |
testCancelCompletedTaskLocally |
engine |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner._impl.Tmhmm2Tester |
| |
| @Test |
| |
testBuildCommand |
cluster runner |
| |
testGetTestCommand |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.MuscleParametersTester |
| |
| @Test |
| |
testConstrainedParametersMaxValues |
runner |
| |
testConstrainedParametersRandomValues |
runner |
| |
testConstrainedParametersMinValues |
runner |
| |
testArguments |
runner |
| |
testOptions |
runner |
| |
testDefaultParameters |
runner |
| |
testParameters |
runner |
| |
testPresets |
runner |
| |
testConfiguration |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner |
| @AfterMethod |
| @AfterClass |
| compbio.data.sequence.FastaSequenceGeneratorTester |
| |
| @Test |
| |
testProteinSequenceGeneration |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.cluster.drmaa.ClusterSessionTester |
| |
| @Test |
| |
testTaskList |
engine cluster |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.data.sequence.FastaReaderTester |
| |
| @Test |
| |
test |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.data.sequence.FastaSequenceTester |
| |
| @Test |
| |
testGetFormattedFasta |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.data.sequence.SequenceUtilTester |
| |
| @Test |
| |
testReadIUPredForGlobDomain |
|
| |
testDeepCleanSequence |
|
| |
testReadIUPredForShortAndLongDisorder |
|
| |
testCleanProteinSequence |
|
| |
testReadWriteFasta |
|
| |
testReadAAConResults |
|
| |
testReadGlobPlotResults |
|
| |
testReadDisemblResults |
|
| |
loadJronnFile |
|
| |
testisNonAmbNucleotideSequence |
|
| |
testisProteinSequence |
|
| |
testCleanSequence |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.TcoffeeParametersTester |
| |
| @Test |
| |
testConstrainedParametersMaxValues |
runner non_windows |
| |
testConstrainedParametersRandomValues |
runner non_windows |
| |
testConstrainedParametersMinValues |
runner non_windows |
| |
testArguments |
runner non_windows |
| |
testOptions |
runner non_windows |
| |
testDefaultParameters |
runner non_windows |
| |
testParameters |
runner non_windows |
| |
testPresets |
runner non_windows |
| |
testConfiguration |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner non_windows |
| @AfterMethod |
| @AfterClass |
| compbio.engine.cluster.drmaa.UtilTester |
| |
| @Test |
| |
testParser |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.ClustalWTester |
| |
| @Test |
| |
testRunOnCluster |
cluster runner |
| |
testAddParameters |
|
| |
testPersistance |
runner |
| |
testOptionsLocally |
runner |
| |
readStatisticsClusterExecution |
cluster runner |
| |
testRunWithMatrix |
runner |
| |
testConfigurationLoading |
runner |
| |
readStatistics |
runner |
| |
testRunLocally |
runner |
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.engine.conf.DirectoryManagerTester |
| |
| @Test |
| |
testGetDirectory |
|
| |
testNanoTime |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.metadata.PresetTester |
| |
| @Test |
| |
testPresetWithMuptiOptions |
|
| |
marshallPreset |
|
| |
validatePresets |
|
| @BeforeClass |
| @BeforeMethod |
| @AfterMethod |
| @AfterClass |
| compbio.metadata.OptionMarshallerTester |
| |
| @Test |
| |
testUnMarshalling |
|
| |
testMarshalling |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
|
| @AfterMethod |
| @AfterClass |
| compbio.runner.msa.ClustalWParametersTester |
| |
| @Test |
| |
testConstrainedParametersMaxValues |
runner |
| |
testConstrainedParametersRandomValues |
runner |
| |
testConstrainedParametersMinValues |
runner |
| |
testArguments |
runner |
| |
testOptions |
runner |
| |
testDefaultParameters |
runner |
| |
testParameters |
runner |
| |
testPresets |
runner |
| |
testConfiguration |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
runner |
| @AfterMethod |
| @AfterClass |
| compbio.engine.conf.RunnerConfigMarshallerTester |
| |
| @Test |
| |
testValidationOnMarshalling |
|
| |
testUnMarshalling |
|
| |
testValidation |
|
| |
testSchemaFromCodeGeneration |
|
| |
testMarshalling |
|
| @BeforeClass |
| @BeforeMethod |
| |
setup |
|
| @AfterMethod |
| @AfterClass |


Pygments
Introduction and Quickstart
« Back To IndexWelcome to Pygments! This document explains the basic concepts and terms and gives a few examples of how to use the library.
Architecture
There are four types of components that work together highlighting a piece of code:
- A lexer splits the source into tokens, fragments of the source that have a token type that determines what the text represents semantically (e.g., keyword, string, or comment). There is a lexer for every language or markup format that Pygments supports.
- The token stream can be piped through filters, which usually modify the token types or text fragments, e.g. uppercasing all keywords.
- A formatter then takes the token stream and writes it to an output file, in a format such as HTML, LaTeX or RTF.
- While writing the output, a style determines how to highlight all the different token types. It maps them to attributes like "red and bold".
Example
Here is a small example for highlighting Python code:
from pygments import highlight from pygments.lexers import PythonLexer from pygments.formatters import HtmlFormatter code = 'print "Hello World"' print highlight(code, PythonLexer(), HtmlFormatter())
which prints something like this:

print "Hello World"

As you can see, Pygments uses CSS classes (by default, but you can change that) instead of inline styles in order to avoid outputting redundant style information over and over. A CSS stylesheet that contains all CSS classes possibly used in the output can be produced by:
print HtmlFormatter().get_style_defs('.highlight')
The argument to get_style_defs is used as an additional CSS selector: the output may look like this:
.highlight .k { color: #AA22FF; font-weight: bold } .highlight .s { color: #BB4444 } ...
Options
The highlight() function supports a fourth argument called outfile, it must be a file object if given. The formatted output will then be written to this file instead of being returned as a string.
Lexers and formatters both support options. They are given to them as keyword arguments either to the class or to the lookup method:
from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter lexer = get_lexer_by_name("python", stripall=True) formatter = HtmlFormatter(linenos=True, cssclass="source") result = highlight(code, lexer, formatter)
This makes the lexer strip all leading and trailing whitespace from the input (stripall option), lets the formatter output line numbers (linenos option), and sets the wrapping
's class to source (instead of highlight).
Important options include:
- encoding : for lexers and formatters
- Since Pygments uses Unicode strings internally, this determines which encoding will be used to convert to or from byte strings.
- style : for formatters
- The name of the style to use when writing the output.
For an overview of builtin lexers and formatters and their options, visit the lexer and formatters lists.
For a documentation on filters, see this page.
Lexer and formatter lookup
If you want to lookup a built-in lexer by its alias or a filename, you can use one of the following methods:
>>> from pygments.lexers import (get_lexer_by_name, ... get_lexer_for_filename, get_lexer_for_mimetype) >>> get_lexer_by_name('python') <pygments.lexers.PythonLexer> >>> get_lexer_for_filename('spam.rb') <pygments.lexers.RubyLexer> >>> get_lexer_for_mimetype('text/x-perl') <pygments.lexers.PerlLexer>
All these functions accept keyword arguments; they will be passed to the lexer as options.
A similar API is available for formatters: use get_formatter_by_name() and get_formatter_for_filename() from the pygments.formatters module for this purpose.
Guessing lexers
If you don't know the content of the file, or you want to highlight a file whose extension is ambiguous, such as .html (which could contain plain HTML or some template tags), use these functions:
>>> from pygments.lexers import guess_lexer, guess_lexer_for_filename >>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"') <pygments.lexers.PythonLexer> >>> guess_lexer_for_filename('test.py', 'print "Hello World!"') <pygments.lexers.PythonLexer>
guess_lexer() passes the given content to the lexer classes' analyse_text() method and returns the one for which it returns the highest number.
All lexers have two different filename pattern lists: the primary and the secondary one. The get_lexer_for_filename() function only uses the primary list, whose entries are supposed to be unique among all lexers. guess_lexer_for_filename(), however, will first loop through all lexers and look at the primary and secondary filename patterns if the filename matches. If only one lexer matches, it is returned, else the guessing mechanism of guess_lexer() is used with the matching lexers.
As usual, keyword arguments to these functions are given to the created lexer as options.
Command line usage
You can use Pygments from the command line, using the pygmentize script:
$ pygmentize test.py
will highlight the Python file test.py using ANSI escape sequences (a.k.a. terminal colors) and print the result to standard output.
To output HTML, use the -f option:
$ pygmentize -f html -o test.html test.py
to write an HTML-highlighted version of test.py to the file test.html. Note that it will only be a snippet of HTML, if you want a full HTML document, use the "full" option:
$ pygmentize -f html -O full -o test.html test.py
This will produce a full HTML document with included stylesheet.
A style can be selected with -O style=<name>.
If you need a stylesheet for an existing HTML file using Pygments CSS classes, it can be created with:
$ pygmentize -S default -f html > style.css
where default is the style name.
More options and tricks and be found in the command line reference.


> draft
Zhong Yu, 2015-09-01
This is a compilation of wildcard use cases for the article Capturing Wildcards
Contents
The classic example of capture helper is reverse(List<?>)
, as shown in JLS
void reverse(List<?> list) { // difficult to work with wild type // forward it to helper method rev(list); } <T> void rev(List<T> listT) { // read from and write back to `listT` // which is easy on a concrete type ... }
Given a (Map<?,?> map)
, we can iterate its entries like
for(Entry<?,?> entry : map.entrySet())
This is deceptively simple, but we know it's more complex under the hood. First, map
is capture converted to Map<X1, X2>
, therefore, entrySet()
returns Set<Entry<X1, X2>>
. The entry
variable can be declared as Entry<?,?>
, because it's a supertype of Entry<X1, X2>
.
Following that example, someone may try this --
Set<Entry<?,?>> entrySet = map.entrySet(); // compile error
it doesn't work because Set<Entry<X1, X2>>
is not a subtype of Set<Entry<?,?>>
.
We can add more wildcards to solve the problem, see Nested Wildcards and Subtyping.
Set<? extends Entry<?,?>> entrySet = map.entrySet(); Iterator<? extends Entry<?,?>> iterator = entrySet.iterator();
But it is becoming too messy. A simpler way is to use a capture helper to do away with wildcards --
void foo(Map<?,?> map) { foo2(map); } <K,V> void foo2(Map<K,V> map) { Set<Entry<K,V>> entrySet = map.entrySet(); Iterator<Entry<K,V>> iterator = entrySet.iterator(); ... }
Source - http://stackoverflow.com/questions/16753587
The compiler often needs to infer a common supertype from two or more subtypes.
For example, the type of a conditional expression (without target typing)
condition ? expr1 : expr2
is a common supertype of expr1
and expr2
. For Exception
and Error
, the supertype is inferred as Throwable
.
If the subtypes are parameterized types, the supertype may be inferred as a wild type. For example,
if expr1
is List<Exception>
, and expr2
is List<Error>
, the type of the conditional expression is inferred as
List<? extends Throwable>
(which is then immediately capture converted).
The algorithm to infer the supertype is Least Upper Bound which is very complicated, and may yield a very complicated wild type. However in most use cases, the programmer doesn't need to know the exact outcome of the algorithm.
Let's see another example, if we invoke the method Arrays.asList
public static <T> List<T> asList(T... a)
with two arguments, one is Set<Exception>
and another is Set<Error>
, T
will be inferred as
Set<? extends Throwable>
, and the method will return List<Set<? extends Throwable>>
.
What are the supertypes of java.lang.Integer
?
From the class definition, Integer
inherits Object, Number, Serializable, Comparable<Integer>
; these are all supertypes of Integer
. Integer
is also a supertype of itself.
But that's not all. Comparable<Integer>
has supertypes that are wild types. In fact
Comparable<Integer> <: Comparable<? extends A> iff Integer<:A
Therefore, for every supertype of Integer
, we can construct another supertype, and so on.
It is also the case that
Comparable<Integer> <: Comparable<? super B> iff B<:Integer
however, since Integer
is final
, B
can only be Integer
itself.
Therefore the following examples are all supertypes of Integer
Comparable<? extends Integer> Comparable<? extends Comparable<? extends Number>> Comparable<? extends Comparable<? extends Comparable<? super Integer>>>
This is a contrived example demonstrating pervasive capture conversions
List<?> list = ...; ( condition ? list : list ).get(0);
The two list
sub-expressions are capture converted first, to List<X1>
and List<X2>
respectively. The type of the parent conditional expression is then derived as the least upper bound of these two concrete types, which is List<? extends Object>
. This type is then capture converted to List<X3>
, therefore get(0)
returns X3
.
Capture conversion is applied everywhere. This may surprise the programmer sometimes, because the type of an expression may not be what it seems to be. For example, the following code does not compile
Class<?> c1 = ...; Class<?> c2 = ...; Collections.singleton(c1).add(c2); // compile error
Collections.<T>singleton
takes a T
argument and returns a Set<T>
. Naively, for (Class<?> c1)
argument, we may expect that the method returns Set<Class<?>>
, therefore add(c2)
should work.
But actually, the c1
argument undergoes capture conversion first, changing its type to Class<X1>
. Therefore T
is inferred as Class<X1>
, and singleton(c1)
returns Set<Class<X1>>
. The add()
method then has the signature add(Class<X1>)
, which does not accept the c2
argument, which has the type (after capture) Class<X2>
.
There is no way to suppress capture conversion here. A workaround is to explicitly specify T→Class<?>
Collections.<Class<?>>singleton(c1).add(c2); // compiles! (but fails at runtime:)
See also - http://stackoverflow.com/questions/30991884 (Mockito method chaining)
Capture conversion only affects wild types; on any other type, the type is left as is. For example
<T> void rev(List<T> list){ ... } <L extends List<?>> void test(L list) { #a rev( (List<?>)list ); // ok #b rev( list ); // compile error }
Line#a
compiles, because the argument type is List<?>
, which is capture converted to List<X>
, and type inference concludes that T=X
for rev()
. See Capture Helper
Line#b
does not compile, because the argument type is L
, which is not subject to capture conversion, even though it is-a List<?>
. Type inference then fails -- no T
can be found so that L <: List<T>
.
This is a curious example where a subtype (L
) cannot be used where a supertype (List<?>
) works; an upcast is required. This might be an oversight of the spec and may be fixed in future.
Source - http://stackoverflow.com/a/30624513/2158288
In most cases, capture conversion is pretty simple, like List<?> ⇒c List<X>
.
However, it gets a little more complicated for more complex type parameters. The classic example is Enum<E>
class Enum< E extends Enum<E> >
The bound of E
references itself. During capture conversion, the bound of E
needs to be substituted too
Enum<? extends Runnable> ⇒c Enum<X> where X <: Runnable & Enum<X>
Subtyping analysis requires capture conversion on wild types. For example, given this generic declaration
interface Data<T> extends List<List<T>>
To analyze subtyping between wild types of Data
and List
Data<? extends Number> ⇒c Data<X> where X<:Number Data<X> <: List<List<X>> <: List<? extends List<X>> <: List<? extends List<? extends Number>> Data<? extends Number> <: List<? extends List<? extends Number>>
Note that Data<?>
is not a List<List<?>>
, see Nested Wildcard.
Suppose for some reason we have to cast a Supplier<Integer>
to Supplier<Number>
, which we know is safe at runtime because of type erasure. Direct casting is forbidden --
Supplier<Integer> supplier = ...; (Supplier<Number>)supplier // error!
which makes perfect sense because the two types are mutually exclusive, therefore casting is provably incorrect.
But we want to force the cast anyway; this can be done by up-casting to a common supertype first, followed by down-casting. Obviously, we can always use Object
as the supertype between any two types
(Apple)(Object)orange (Supplier<Number>)(Object)supplier
but it's probably a good practice to use a supertype that's closer to the two types
(Supplier<Number>)(Supplier<? extends Number>)supplier
If that's too ugly, maybe use an unbounded wildcard
(Supplier<Number>)(Supplier<?>)supplier
This is about on-site casting. For other ways of conversions, see Missing Wildcards.
It is not uncommon that a method signature forgets to include proper wildcards. Such mistakes exist even in core Java APIs which were designed under a lot of scrutiny. Interestingly, it seldom causes any problems to API users; and, when problems do arise, there are simple workarounds ( requires Java 8 ).
This observation can be used to justify deliberately omitting wildcards in APIs, to escape from Wildcard Hell.
Consider the following method signature which lacks proper wildcards
void foo(Function<String, Number> func)
we won't be able to pass compatible functions to it
Function<CharSequence, Integer> f = ...; foo( f ); // error!
However, it usually isn't a problem, because in most use cases, the argument is a lambda expression or method reference, and compiler type inference takes care of providing the desired target type
Integer str2int(CharSequence chars){ ... } ... foo( str->str2int(str) ); // ok! foo( this::str2int ); // ok!
If the argument is an expression of a fixed static type, in majority cases it happens to be the right type -- the target type.
In rare cases, like foo(f)
, the argument type doesn't match, and we need to convert it. On-site casting is possible, but way too ugly. For functional interfaces, conversion can be done simply by method reference
Function<CharSequence, Integer> f = ...; foo( f ); // error! foo( f::apply ); // ok!
However, the purpose of f::apply
might be unclear to readers of the code. Personally, I'd like to use a help method to make the intent clear that I'm doing a variant cast --
foo( vary(f) ); ... @SuppressWarnings("unchecked") public static <T,R> Function<T,R> vary(Function<? super T, ? extends R> f0) { return (Function<T,R>)f0; // erasure }
The implementation of vary()
depends on type erasure; it is perfectly safe at runtime, because method f0.apply()
indeed accepts any T
and returns an R
, therefore f0
can be safely used as a Function<T,R>
.
Similarly, we can define a vary()
method for each functional interface that's intuitively variant, like Consumer
etc.
For interfaces like List
, we'll need two helper methods, one for covariant cast, and one for contravariant.
public static <T> List<T> covary(List<? extends T> list) { return (List<T>)list; } double sum(List<Number> list) // no wildcard! // usage List<Integer> intList = ...; sum( covary(intList) );
If we are sure that sum()
wants a list of Number
in a covariant sense, we can safely pass it a List<Integer>
this way.
Occasionally we may encounter types like List<? extends String>
, with a wildcard upper-bounded by a final
class. It's unlikely that the programmer voluntarily constructs a type like that. Most likely it's imposed by a List<? extends T>
in some generic API which happens to be substituted with T→String
.
List<? extends String>
seems odd. Since String
is a final
class, the only subtype is String
itself. Therefore it's tempting to think that List<? extends String>
is the same as List<String>
.
However, as far as the compiler is concerned, they are two distinct types. This is because final
is not final; it is possible that someday String
class removes the final
modifier, and new subclasses of String
are introduced.
Therefore, List<? extends String> ≠ List<String>
; in particular, this subtyping is false
List<? extends String> <: List<String>
Although, as a practical matter, if we have to, we may cast List<? extends String>
to List<String>
, reasoning that it must be safe at runtime, as long as String
stays final
.
On the other hand, what about List<? super Object>
? The only supertype of Object
is Object
itself, therefore, aren't List<? super Object>
and List<Object>
the same type?
If two types are subtypes of each other, they are the same type, or at least, they are semantically equivalent. So the question is whether the subtyping algorithm agrees that
List<? super Object> <: List<Object>
which depends on whether the subtyping is true on the capture conversion
List<X> <: List<Object> for any X that Object<:X
The reasonable answer is yes. And javac
seems to agree that List<? super Object> = List<Object>
. For example the following code compiles without any problem
void test( Set< List<? super Object> > x, Set< List<Object> > y ) { x = y; y = x; }
We have the following subtyping property
• G<? extends B> <: G<? extends A> if B<:A
However, the converse may not be true, because we also have to consider the bound of the type-parameter.
For example, consider this generic declaration
class Foo<T extends Exception>
The following wild types are all equivalent, and they are subtypes of each other
Foo<? extends Object> Foo<? extends Throwable> Foo<? extends Serializable> Foo<? extends Exception>
because, the wildcard bounds provide no more restriction than the type-parameter bound. During capture conversion,
Exception = Exception&Throwable = Exception&Serializable
In essence, what's really important to a wild type is its capture conversion, not its syntactic form.


WhatsApp Everywhere!
October 2, 2015
It is a long weekend, So I planned a travel to Chennai to visit my friends. As usual booked a ticket in RedBus to travel and got into pickup bus. To my surprise, the bus was full and I was asked to stand with assurance from the driver that it will not take more than 15 min. There was a guy who was sitting, looked at me and smiled, I didn't know the reason at that time but when it took an hour to reach Majestic(Bangalore Bus Terminus), I just smiled back.
When I was standing in the bus, I took my phone and informed my sister that I boarded the bus. After pinging her, I just glanced away from the phone to find a surprise that everyone in the bus where using WhatsApp. No, I haven't read at other people conversation. I was thinking, Mark you made a good purchase. Then I was analysing what caused people to use WhatsApp to be precise what caused people to turn WhatsApping as their behaviour to talk to friends.
From my perspective following are the points that make me believe things that make WhatsApp a big success.
- Even though they say that they are freemium and people have to pay $1 after a year of use, I don't remember that I ever paid them
- They really concentrated on the developing markets like India, Brazil and made their app work on even the weakest network and cheap phone
- Network effect: People brought in other people to the app because they found value in it and wanted to share the same with their friends
- Bundling with carriers to provide free data for using WhatsApp, I think this is the groundbreaking move
If I get additional thoughts, will update. If you also do have some thoughts, please comment below lets have a discussion.
Being overall said, I really like WhatsApp team because they taught me how to stay lean and move faster.


Shraddha Kapoor shares an adorable picture from Serbia while shooting for her next 'Baaghi 3'
by TIMESOFINDIA.COMWith the back to back success of her recent releases, 'Saaho' and 'Chhichhore', looks like actress Shraddha Kapoor is on a shooting speer where the actress is currently shooting in Serbia for her upcoming next, 'Baaghi 3'.
Taking to her social media, Shraddha shares, “Surrounded by one of my most favourite things. Trees! 🌳❤” and the fans, her peers went gaga over the actresses’ picture. Wearing a bomber blue jacket with a cute cap to battle the cold waves off.
Shraddha posted a couple of more images with some scenic view and wrote, "If you truly love nature, you will find beauty everywhere. - Vincent Van Gogh"
She posted a picture with her co-star, Vijay Varma, apart from her crew and shared, "Chillers only, please 🙃❤"
Shraddha will next be seen in Remo D’Souza’s Street Dancer 3D, which reunites her with her ABCD 2 co-star Varun Dhawan. As of now, she is busy filming for Baaghi 3 with Tiger Shroff.


main screen
logo
history button
sort button
pictures and symbols
of different categories
information
name,
type/category
meal examples
macros
pictures of places
Search bar
Rating scale
INPUT HEALTH
Suggestions
Categories
Local Suggestions
based of previous orders
or user prefrences
input macros, allergies, or
anything other criteria


- Lot Size: {{ sproperty.lot_size }} SQ FT
- Bed Rooms: {{ sproperty.bedrooms }}
- Bath Rooms: {{ sproperty.bathrooms }}
- Area :{{ sproperty.areaSqft }} SQ FT
- Garage: {{ sproperty.garage }}
- Floor Area : {{ sproperty.areaSqft }} SQ FT
- Year Build : 2019
- Terrace : {% if sproperty.terrace %} YES {% else %} NO {% endif %}
- Stories: {{ sproperty.storey }}
- Rent / Sale: {% if sproperty.is_forSale %} SALE {% else %} RENT {% endif %}
{{ sproperty.description }}
23 Reviews
Jacob Webb
14 March 2018
When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrov
Jacob Webb
14 March 2018
When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrov
Jacob Webb
14 March 2018
When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrov
Give a Review
(98%)
20 Reviews
(85%)
10 Reviews
(70%)
5 Reviews
(10%)
0 Reviews
(0%)
0 Reviews


One support number for all your computer and IT problems. When you are a part of Irma, you are always prepared for the unexpected.
 Tell us what is the matter, and one of our experts will call you back. You pay based on time and results.
We employ freelance experts from a wide array of fields. You are guaranteed to get one that matches your need.
By registering with Irma, you get access to our support number, every hour of every day. Call us and describe your problem. We use state of the art artificial intelligence discern the details of your problem and forward it to our experts. Our experts then decide among themselves who is the best fit to handle your specific problem, and will call you back. When your support call ends, they get rewarded based on their performance and time spent. You get charged immediately or on a monthly basis, whichever you prefer.


1) Configure the Wallet
If you don't use the GUI, go to the non-gui steps. Ignore this if you don't know what this means
a) In the wallet, go to the hamburger menu (top left) and then select Settings -> Researcher wizard. Choose Solo ("Beacon" may display as "Action Needed")
If your wallet doesn't look like the image above, press the "Start Over" button
b) Press next and enter the email you used on your BOINC projects
Enter your email for your BOINC projects, and don't enter<EMAIL_ADDRESS>c) Click next and make sure you see a check mark (✔) next to the field labeled CPID.
If you get a "split CPID or mismatched e-mail" error or have any issues, proceed to the
troubleshooting section
Note that your CPID and email will be different than in the image above
d) Click next and then press the advertise beacon button. The beacon will cost less than 1 GRC to send. If you don't have 1 GRC, go to the previous step to see ways to acquire some for free. If you have GRC but receive an error about an insufficient balance, your GRC was received but you must wait a few minutes for the transaction to confirm, so try again in 15 minutes.
e) You should now see the screen below saying you have a pending beacon. If you see any errors go to the
troubleshooting section
f) Press next and then press the copy button or write down the code. You will need this for step g
Make sure to copy the code on your wallet and not the code above. Each code is different
g) If you press next you should now see the screen below
h) Go to BOINC and click a whitelisted project you work on. Click on the Your Account button under Project web pages. If not listed, click on Home page and look for a setting or account options page on the website
Advanced View
Simple View
i) If you see the page below, click on the other account info link. If you see something else, look for a place to change your username
j) Change your username temporarily to the code in your wallet until the beacon verifies (takes ~24-48 hours). This proves to the network that you own your account and are not trying to steal rewards from someone
Your BOINC project may look different. Don't use the exact code above. Use the code that was in your wallet
Some projects require you to enable stats exports. If any of yours do, follow the steps for those project to enable it. If you skip this step, your beacon will not validate and you will not earn GRC for your BOINC crunching. Currently required by:
{%- for project in site.data.whitelist.projects -%}
{%- if project.gdpr == "yes" -%}
{%- endif -%}
{%- endfor -%}
k) After ~24-48 hours your beacon should validate and you should see something like the screen below. After you see this, you can now change your username to whatever you want
2) Running the Wallet to Stake
See the staking wiki page for more details on what staking is
l)
If you locked the wallet (not locked by default), unlock the wallet for "Staking Only". It is recommended to have it encrypted for security.
Screen after the Unlock Wallet button is pressed. Doesn't apply or show as an option if the wallet has not been encrypted
m) Run the wallet close to 24/7. When your wallet is off, you miss chances to stake blocks and earn rewards. Make sure you see a filled in stack of squares in the bottom right like below
Your numbers will be different when you hover over the icon. Make sure the icon is lit and is not red or unlit. If it isn't, hover over it to see what issues are going on. Note that the "average" time to stake is an estimate, sometimes you may stake 5 times more often than "expected" and sometimes you may take 5x as long to stake as "expected".
n)
Every 6 months, your beacon will renew automatically if your wallet is open and unlocked for staking.
Image of the screen that shows up when you need to renew your beacon.
o) Keep the wallet up to date as updates are released
3) Bonus Step: Sidestake to Help Gridcoin's Development
Gridcoin has a fun feature called sidestaking which enables you to donate a portion of each stake you make to Gridcoin's development. This isn't required of course, but it helps us add new features and make sure more people can learn about Gridcoin!
- Close your Gridcoin wallet
- Find your gridcoinresearch.conf file in your Gridcoin data folder
- Add the following two lines followed by enter. Be sure to change 5 to the percent you want to donate
enablesidestaking=1
sidestake=bc3NA8e8E3EoTL1qhRmeprbjWcmuoZ26A2,5
- Re-open your Gridcoin wallet
Troubleshooting
Q: My Wallet Is Not Staking
Hover over the icon with the arrow to see why it is not staking
Check that the wallet is unlocked
Run the diagnostics under the help tab
If you see that your wallet is out of sync, try waiting a few hours leaving the wallet to sync
If the "verify clock" test has failed, check that your timezone on your computer is correct and that the time is also correct
If you see the ETTS (estimated time to stake) check has failed, consider either getting more coins or following the pool guide
Remember that the ETTS is an average time to stake. For example, if you average expected staking frequency is once per month, some months you may stake 5 times, and other times you may wait 5 months between a stake.
Q: My Balance is Too Low To Send a Beacon
You need around 1 GRC to send a beacon. If you recently received some GRC, you will need to wait a few minutes for the transaction to be confirmed before using that GRC for a beacon.
You can use faucets to get free GRC for sending a Beacon: Gridcoinstats.eu, Gridcoin.ch. Our discord is a great place to ask for a few free GRC to get started
Q: I See Multiple CPIDs or Receive a CPID Mismatch Error
Make sure all your BOINC projects are attached using the same e-mail address. Remove any that aren't.
If you did components of both the pool and solo mining guide (you should only pick one), detach pool projects in BOINC go to Tools -> Stop using account manager and then manually remove any projects added by the pool
It can take some time for CPID's to "settle" onto one final CPID. You can hurry this process along using these steps
After these steps, restart the crunching wizard in the wallet. If the problem persists, go to one of our support channels for help.
Q: My Beacon Isn't Being Verified
Beacons typically take up to 24 hours to verify
Make sure you are crunching under your own account in BOINC and that the project is on the whitelist
Make sure you changed your username
Check if your project is one that requires you to enable stats export
- Go to the whitelist page and see if your project requires it
- If you see your project requires it, follow the steps to enable it that are linked next to your project
Try waiting if all of the above are correct and its been less than 48 hours
General Help
Try running the diagnostic (located under the help tab) and check that everything passes
Make sure any projects you crunch are on the whitelist. If it isn't on it, you will not be rewarded for it
Check that the CPIDs (cross project identifier) are the same across your project
-
If you found differing CPIDs, make sure you are using the same account. If you are on the same account, use this guide to help fix issues
If you just started crunching, you may need to wait around 24-48 hours for statistics to sync
Still not working? Try going to one of the community platforms (such as Reddit or discord) and ask for help there. A full list of platforms is at the header and footer of this site
Configure the Wallet (non-GUI steps)
I) Unlock your wallet fully if you've locked it
II) Run the command advertisebeacon
and make note of the verification_code
. If you lose track of the code, get it again with beaconstatus
III) Login to one of your BOINC projects web pages and change your username to the verification code (you can change it back after your beacon validates)
IV) You can now lock your wallet again (you can unlock your wallet for staking too).
V) Wait for your beacon to validate (check it with beaconstatus
)
VI) Leave your wallet running and unlocked for staking as close as possible to 24/7. This will allow your wallet to stake and earn your rewards
Note: BOINC is needed on the machine running the wallet. It needs to be connected to any project on your account (it can be suspended)
If you setup BOINC in a non-default path, add it in the config (see Step 2)


The AddressLabel control displays the patient's address in an in-form (vertical) or in-line (horizontal) format. In the in-form format, each line contains a single left-justified address element; no separator characters should display. In the in-line format, multiple elements display on a single line, with address elements separated by a single comma and a single space. Individual address elements should not split across multiple lines.
Additional information relating to this control can be found on the corresponding MSCUI control page.


Wigwam is a Lancashire based interior design studio specialising in residential projects for private individuals throughout the North West of England.
Wigwam provides a personalised, relaxed design service from their studio in Lancashire. Sam designs each project personally, whilst also concentrating on what she does best and giving the client the peace of mind that the project will be carried out seamlessly.


Installing the desktop
- Motherboard
- CPU/processor
- RAM
- Hard drive
- Power supply unit
- Expansion cards
- Network Card
Html
Html is useful to be thought. Its part of the coding which helped me create my own webpage.
Windows Shortcut
Learning Windows keyboard shortcut is a useful skills to have. This will obsolutely help me out in the future.
Using Google search Right
Learning how to look up for peoples information on google search was interesting. Specaling going to the home security camera.


Money Play. How should Red play 53?
pips Red=117 White=122
(CorrectAnswer= 0/0, ErrorScore= 0)
We can quickly eliminate 7/4, 7/2. This puts checkers in the wrong position and what is Red going to next turn when White may well have a five-point home board? The choice is to break either the mid-point or the bar-point.
18/15, 18/13 is great when it works but when it doesn’t thing can go wrong very quickly. The correct play is 13/18, 13/10 which slightly reduces the number of hit and cover rolls but importantly keeps the bar-point as an escape route and also maintains the pressure on White’s three checkers on his mid-point.
Both 7/4, 7/2 and 18/13, 18/15 are very close to blunders in XG terms.
18/15, 18/13 is great when it works but when it doesn’t thing can go wrong very quickly. The correct play is 13/18, 13/10 which slightly reduces the number of hit and cover rolls but importantly keeps the bar-point as an escape route and also maintains the pressure on White’s three checkers on his mid-point.
Both 7/4, 7/2 and 18/13, 18/15 are very close to blunders in XG terms.
1. Cubeful 2-ply 13/10 13/8 Eq.: -0.054 0.498 0.086 0.002 - 0.502 0.123 0.002 2. Cubeful 2-ply 18/15 18/13 Eq.: -0.124 (-0.070) 0.470 0.064 0.002 - 0.530 0.164 0.002 3. Cubeful 2-ply 7/4 7/2 Eq.: -0.149 (-0.095) 0.473 0.077 0.001 - 0.527 0.146 0.002 4. Cubeful 0-ply 6/3 6/1 Eq.: -0.231 (-0.177) 0.449 0.062 0.000 - 0.551 0.154 0.000 5. Cubeful 0-ply 13/8 6/3 Eq.: -0.316 (-0.262) 0.431 0.072 0.001 - 0.569 0.196 0.005


Get insights that help your business grow.
Discover the benefits of data analytics and make better decisions regarding revenue, customer experience, and overall efficiency.
Discover the benefits of data analytics and make better decisions regarding revenue, customer experience, and overall efficiency.
10k+ companies
314 templates
12M+ queries


![Guard Icon image](images/guard.png) # Listen multi-platform issues --- # thibaud.gg --- # Listen gem --- # Extracted from Guard --- # 3,500,000+ downloads ??? https://rubygems.org/gems/listen --- # Listen to file modifications --- # Should work everywhere! --- # The issue --- # Use OS specific gems - rb-fsevent (OS X) - rb-inotify (Linux) - rb-kqueue (BSD) - wdm (Win) - polling fallback :( --- # Gemspec ``` ruby Gem::Specification.new do |s| s.name = 'listen' # ... s.add_dependency 'celluloid' s.add_dependency 'rb-fsevent' # if os == 'darwin' s.add_dependency 'rb-inotify' # if os == 'linux' # ... end ``` ??? Interpreted on package time... too bad http://stackoverflow.com/questions/4596606/rubygems-how-do-i-add-platform-specific-dependency --- # Gemfile ``` ruby gem 'listen' gem 'rb-fsevent' # if os == 'darwin' gem 'rb-inotify' # if os == 'linux' ``` ??? Interpreted before generating the Gemfile.lock... too bad http://bundler.io/v1.5/man/gemfile.5.html --- # Gemfile.lock # :'( ??? https://github.com/bundler/bundler-features/issues/4 --- # Our "solution" ??? https://github.com/guard/listen#listen-adapters --- # Travis CI ??? https://github.com/travis-ci/travis-ci/issues/216 --- # Thanks!