To go on the academic job market requires that by late November you have one pretty good paper, and two paper ideas. When first sending your packet to departments, ask for a faculty list with research interests, so you will know with whom you are dealing.
1. Tell me about your thesis.
§ Prepare a five minute talk. Sound enthusiastic! Realize that most of your interviewers know little about your field, so provide lots of motivation for your study. Practice the talk with friends before the meetings.
§ Prepare answers to the three or four most frequent questions and criticisms of your work.
§ Prepare a few thoughts about further research concerning your thesis.
2. When do you think you will finish your dissertation?
Your odds of landing a job are higher if you can convincingly argue you will be done by June (best) or at least by September. Employers do not like new assistant professors to arrive with unfinished dissertations (although many such assistant professors exist).
3. What are you thinking about working on next?
Describe one or two research projects that you would like to work on next. You don't need to carry out these exact projects. You can include extensions of your thesis: ideas it has spawned, or tests of it you will someday do. At least one idea should be distinct from your thesis. On the other hand, don't be scattered. Most of your ideas should hang together, as if you were writing a book or two.
4. What courses would you like to teach?
Be sure to know the needs of the department before answering this one. Mention undergrad and grad courses, and perhaps an advanced grad course. The advanced courses are sought after; don't sound as if you demand to teach one. Mention a service course (intro, micro, or macro) that you are willing to teach.
Know the text you might use in the course, particularly for undergraduates. (You can ask around for plausible texts, and perhaps reading lists.) Think about an outline of topics for one or two courses.
The interviews are also for you to find out things. Also, asking questions shows you are interested, and fills gaps in the conversation that the incompetent interviewers leave when they run out of things to say. Do not discuss money. There is lots of time for that.
§ Facilities: library, research assistants, computers, research institutes, etc.
§ Teaching:
o Load: anything above four quarters or 3 semesters a year is heavy, below that is light.
o Likely courses you would teach
o The choice you would have
§ Possible to create your own course?
o Quality of students: undergrad and grad
§ Faculty:
o Size, interests, mix of fields
§ Visit faculty web pages to find out who is in your field beforehand.
§ Department: direction it is going, research vs. teaching,
§ Later in the process you can ask about:
o Class size, TA's, readers, undergrad vs. grad
o Summer money and travel money
o Tenure patterns (% assistants who get tenured)
o Secretary, photocopy and phone rules, parking
§ These sound minor, but can be important in the long run
o Personal computer and printer; access to a larger research machine
o Housing help: search, mortgage, faculty housing, flybacks to look for housing
o Research assistant
o Reduced teaching load first year
o Minimize # of preparations (separate courses) you teach in one year
o Any grants that are available. (Some may have deadlines before your arrival.)
Job Sites
§
Jobs for Economists
http://www.aeaweb.org/joe/
§
§ Chronicle Careers
o Mgmt: http://chronicle.com/jobs/100/200/allindex.htm
o Policy: http://chronicle.com/jobs/100/600/7000/
§
Association for Public Policy Analysis and
Management (APPAM) http://www.appam.org/index.asp
§
Academy of International Business
http://aib.msu.edu/careercenter/jobpost.asp
Other Useful Sites
§
Two articles on market for junior economists at
JOE website:
o
http://www.aeaweb.org/joe/articles/2004/cawley_2004.pdf
o
http://www.aeaweb.org/joe/articles/2004/2004_market.pdf
§
The importance of asking good questions
http://www.quintcareers.com/asking_questions_at_interview.html
§
Landing Your First Job
http://chronicle.com/jobs/sidecol_library/firstjob.htm
§
On negotiating your offer
http://chronicle.com/jobs/news/2005/11/2005110801c/careers.html
The key to the interview is to be enthusiastic. Interviewers are looking for (1) people who would accept an offer, and (2) nice colleagues. The first consideration implies that you should have a reason why the interviewer's school is really your first choice ("Oh, I just love -40 in winter and searing heat in summer," she explained to the Minnesotans). The second point implies that you must be friendly, witty, and easygoing (during the high-pressure meetings!). Nothing is more important than being friendly and collegial. They are looking for someone they would like to have lunch with every day-this dominates most other criteria.
This is just one in a series of David Levine's Cheap Advice. Collect them all! Dazzle your friends! Feel free to circulate to anyone who might find them useful.
David Levine's Cheap Advice for Writing a Dissertation .
David Levine's Cheap Advice for Presenting Results
David Levine's Cheap Advice for Going on the Job Market
David Levine's Cheap Advice for Starting as a New Faculty
Write to David Levine, Haas School of Business, University of California, Berkeley CA 94720<EMAIL_ADDRESS>for additional Cheap Advice, or to give Cheap Advice back to the source. Feedback is always appreciated.
I was trained as a graduate student to read other people's research. Then I finished my special field exams and was told to go write some research. I compare my experience to learning how to read literature, then being asked to do creative writing. Not unrelated, but hardly the same set of skills. Here is some advice I found helpful when I was searching for a topic.
Hints for finding paper topics : Choosing a paper topic requires balancing the importance and feasibility of the topic. Feasibility involves tractability for theoretical research, and data availability for empirical research. I recommend creating a number of one-page paper proposals, each with a topic sentence and data source.
There are several heuristics for finding researchable paper topics. One way is to list three of four papers you like. This list may hint at the style, political point of view, level of abstraction, and methods that are appropriate for you.
Other paper ideas are motivated by bad research, not good: find statements by policy-makers, analysts and journalists that make you angry, and find data sets to address the issue. When studying for exams, keep a list of stupid things you read to return to during the dissertation stage.
Don't be afraid of normal science: repeating in a longitudinal data set what others have done only in the cross section. Some paper ideas are data-driven: read codebooks from a variety of data sets and see if certain questions spark ideas or tests of theories you find interesting. For every paper you read, think what else you would have done with that dataset or methodology.
Write a paper , not a dissertation. A dissertation can be a daunting prospect. If possible, focus on a 25-page paper with a clear one-sentence topic. If you like this paper, then it can become the basis of a dissertation. I promise you that just about any topic can grow to 150 pages; nearly all topics students first choose are WAY too broad.
A dissertation is any stack of papers with three signatures on the top sheet . Paul Samuelson's dissertation was modestly entitled Foundations of Economics . It lived up to that title, and remains a classic to this day. I initially felt that my dissertation should be, if not that good, at least vaguely comparable in the sense of answering one of the Big Questions.
Do not fall prey, as I did, to the "magnum opus fallacy". A dissertation should be normal science that certifies your competency. Save the big thoughts in a file, and get finished! Write an opus when you are a professor, and are being paid for it. Meanwhile, negotiate the smallest useful chunk of the Big Project with your dissertation advisers, and do that single piece of research.
A dissertation group is essential . Having folks to bounce your ideas off of at an early stage is irreplaceable. The members of your dissertation group do not need to have similar fields; any smart person will be useful at each stage of a project, from vague ideas through research design, and write up. All you need are people who are willing to listen to raw ideas, and willing to read first "pre-drafts" of chapters.
This is just one in a series of David Levine's Cheap Advice. Collect them all! Dazzle your friends! Feel free to circulate to anyone who might find them useful.
David Levine's Cheap Advice for Writing a Dissertation
David Levine's Cheap Advice for Presenting Results
David Levine's Cheap Advice for Going on the Job Market
David Levine's Cheap Advice for Starting as a New Faculty
Write to David Levine, Haas School of Business, University of California, Berkeley CA 94720<EMAIL_ADDRESS>for additional Cheap Advice, or to give Cheap Advice back to the source. Feedback is always appreciated.
When people evaluate you for tenure, they need to know (1) who you are, and (2) what (one or two sentences) results you are associated with. Thus, my basic advice is focus your research, get it read, and get seen. Sadly, the visibility of yourself is as important as the quality of your work in professional success.
Have a theme : You should think of your research as writing a book, not articles. The idea is that your first five years' research should involve one or two unifying themes.
The reason for sticking to a theme is that people evaluating you need to be able to say "This young scholar is one of the world's experts at _______." You get to fill the blank. However, your work must hold together so that there is some word or phrase they can stick in the blank.
In an ideal world, academics would be able to study any important topic they were competent to shed light on.
Get read : List people who should read your papers. The list should include at least three groups: a dozen or so senior people in your field who are likely to write letters evaluating you when you go up for tenure; classmates and other buddies who are likely to actually read the stuff; and people who work on related topics and you would like to cite your stuff. Make up a master list that receives most papers, and modify it for each paper. Look at each paper's bibliography for ideas on who might want to see it. (Everyone wants to see papers that cite them -- that's why so many professors read papers from the back.)
Typically you should mail out papers in their working paper stage, one draft before submission.
Feedback is crucial. All research has flaws, and all drafts have easy-to-correct flaws. Make sure your research and writing has lots of feedback to fix both types. Especially for the clarity issues, be open minded. If your parents, friends, colleagues in unrelated disciplines, will read the sucker, send it to them!
Get seen : Travel every year to give seminars. If you are going to be near a university, call up six months early and tell them you are available and would like to give a seminar.
 Invite a mix of friends and more well-known people.
Learn how to be a Manager : Secretaries and research assistants are just a few of the people you need to learn to manage. The secrets are few: respect and communication. Respect is shown, for example, by asking their schedule when you propose work, and by always saying, "Thank you." In addition, if they have expertise in a job, only give advice on how to do it if they ask.
Most attempts at communication are not completely successful. (In the classroom this problem is reflected in my maxim: "I can teach faster than they can learn.") Thus, the golden rule of communication is "Say unto others what you believe others have said unto you." After giving your instructions, always ask your RA to explain what she thought you asked her to do. (Do this in a way that makes it clear you consider yourself at fault for any miscommunication. Perhaps: "I didn't explain that very well. Can you tell me what you are planning to do?") If they don't repeat back to me their understanding of my instructions, then it is unlikely the job will be accomplished as I expect.
Budget your research time : In economics research begun in year t usually leads to a first draft in year t+1 or t+2. Circulating it and presenting it at a seminar or two brings us to year t+3. Submit it to a journal and they will (if you are lucky) ask for a revision in year t+4, which you might complete that year. If so, they could accept it as fast as year t+5, but it might not come out till year t+6. On the one hand, many papers can move from conception to publication in less than six years; on the other hand, many papers take more.
Count back from the time you need to submit your tenure file. If you are three years away and your case is less than 100% solid, don't begin any new research! At this point your priority must be to move working papers and papers with requested revisions into the Accepted pile.
This is just one in a series of David Levine's Cheap Advice. Collect them all! Dazzle your friends!
David Levine's Cheap Advice for Writing a Dissertation
David Levine's Cheap Advice for Presenting Results
David Levine's Cheap Advice for Going on the Job Market
David Levine's Cheap Advice for Starting as a New Faculty
Write to David Levine, Haas School of Business, University of California, Berkeley CA 94720<EMAIL_ADDRESS>for additional Cheap Advice, or to give Cheap Advice back to the source. Feedback is always appreciated.
Authors must work hard to make their results easy to follow. Thus, tables must be comprehensible by themselves. That is, a reader should be able to understand a table without reference to the text (and preferably without reference to other tables). The converse rule is that the text should stand by itself, even if a reader ignores the tables.
Variable names should be self-explanatory. The text should flow without ever showing that the reader has encountered a variable name. For example, "Each plant visit by a social scientist corresponded to 3.1% higher voluntary turnover per month (SE = .9%, P < .05)" is much better than "The coefficient of SCISTUD on VOLTUR was .031 (.009)," which is better than "S and V were significantly related." In short, nobody should know what passed between you and your computer in the middle of the night. Name your dummy variable Male or Female , but not Sex .
Often variables are proxies for conceptual variables. If you want to measure complexity, but your variable is log(employment), name the variable employment (if all variables are expressed in logs) or log(employment) , not complexity .
Each table has number and a meaningful title: "Wages Do Not Rise with Tenure," not "Wages."
All statistical tests include the name of the test, the test statistic, and the significance level. Include a brief description of complex procedures at the bottom of the table. Remind readers of the meaning of complicated variables.
Each estimated equation lists the dependent variable and sample size. If one of these is constant for an entire table, list it only once. Always include measures of goodness of fit such as R² or log-likelihood. Usually include a test of the significance of the entire regression (such as an F test for ordinary least squares), and appropriate residual diagnostics (such as Durbin-Watson statistics and heteroskedasticity tests).
Coefficients should include standard errors or t statistics, and some indication of statistical significance (P values or * for P < .05, ** for P < .01). A note explains whether there are standard errors or t statistics. Report P < .10 only if the sample size is small. For very large datasets it makes sense to demand a higher degree of certainty, so only report P < .01.
Include a meaningful number of digits, usually at two or three significant places. Neither .34849560 (3.132534) nor 0.00 (SE = 0.00, P < .001) is useful. Sometimes multiply or divide a variable by 10 so the coefficient is in a meaningful range.
Always in the text, and often in the tables, translate the coefficients of interest into words. For example, convert logit coefficients to measure how a one-unit change in the variable affects the probability of the occurrence of the event (dP/dX). Translate hazard rate coefficients to show how a one unit change in the variable affects the expected time until some event occurs: "If the union local is in a city, its expected lifetime was four months shorter than if it was rural."
Also, always explain whether the effect is large or not, perhaps by comparing its size to something readers understand. For example, the importance of marital status on wages can be expressed as how many years of education are required to raise wages by as much. Sometimes standardized coefficients (expressed in standard deviation units) are useful: "A one month increase in training (approximately one standard deviation) corresponds to 4 percent lower turnover (approximately one half of a standard deviation)."
Effect sizes from Lisrel, factor analysis, path analysis, ordered logits, etc., are hard to understand. Thus, explain the size as well as the statistical significance of the important effects.
Statistical significance : Most authors focus on whether coefficients are statistically significantly different from zero at the 5 percent level. Thus, if b 1 is statistically significant from zero at the 5% level, but b 2 is not, some authors write as if b 1 is different from and more important than b 2 . At a minimum, authors should focus on confidence intervals, and explicitly test if b 1 and b 2 differ by statistically significant amounts.
Summary statistics should be included for the referee, although they do not always need to be in the paper. Usually include means, standard deviations, units, sources, geographical region covered, and sample size. Usually include summary statistics for control variables as well as for the main variables of interest. Include the statistics for the un-logged version of any important variables you use in log form. If your paper computes important and meaningful intermediate results (residuals from a first-stage equation, for example), include their summary statistics.
Often give the referee a table of correlations of either the main variables or of all the variables.
Use simple statistical procedures to complement fancier analyses. Many
papers have a simple comparison of means as their main result (to be formalized
and measured more precisely in later sections). If your paper has such a
comparison at its core, then present the unadjusted means (e.g., men vs. women,
or
Figures and graphs , like tables, are supposed to be comprehensible without reference to the text, and the text without reference to the figure. Place labels (in words, not symbols or variable names) and units on axes.
Equations worthy of being in your paper can be expressed as a sentence. Do so. Many economic theories generate an interesting first-order condition. Restate it in words: "At the optimum, a dollar spent today must bring the same utility as a dollar spent tomorrow, suitably discounted."
Abstracts present the question the paper will answer. Since social scientists are not mystery writers, abstracts also summarize the results. Inability to write an abstract of fewer than 100 words often indicates deeper problems with the paper.
No research is perfect. This section presents a checklist of common imperfections in empirical research. Discuss the limitations of your paper and plausible alternate explanations for the results.
Surveys face problems with the match between the actual sample and the perfect sample. Always mention the response rates and possible response biases. Are responses likely to be sensitive to changes in the wording of the questions? Do respondents have incentives to hide their attitudes? Are attitudes likely to match behaviors?
A naming issue appears when data undergo factor analysis or are summed into an index. Do not merely name the factors or indices, but present a sample of the questions along with the factor weights. Differentiate exploratory from confirmatory factor analysis.
Econometric and statistical analyses are subject to all the difficulties of surveys. They also fall prey to the "textbook chapters:" simultaneity, sample selection, measurement error, outliers, and so forth. Almost all analyses should use methods that adjust for clustering of the sample (as in most common datasets) and that are robust to the presence of heteroskedasticity. Re-analyze the data several times to check the specification, and make sure that your results are not sensitive to changes in the estimating technique, functional forms, control variables, and so forth. If all is well, allude to these results briefly, but do not include them in the paper. Often include copies of these tables for the referee.
Experiments almost always have questionable external validity. Is there any reason to believe people in actual organizations involved in complex social networks making decisions that affect their careers over many years act the way the college sophomores do in your one-hour treatment?
Is the name you have given your treatment appropriate? If you tell one group of people they are not worth the wage they receive, this treatment may affect self-esteem as well as perceived equity. Thus, naming the treated group perceived inequity can mislead readers.
Case studies have limited generalizability. Explain in what sense this case study generalizes, and outline the limits of its generalizability. What are the likely biases due to subjective perception and reporting?
Causality is almost never clear in the social sciences. Common problems include reverse causality, selection effects, and omitted variable bias. Discuss alternative causal explanations for the results. These alternative channels often suggest additional tests you might perform.
When using instrumental variables or multi-equation methods such as two-stage least squares and maximum likelihood, always list your instruments or other identifying assumptions. Include these lists in both the text and the tables. Justify why it is plausible that your instruments are exogenous. Both identification by functional form (as in many sample selection models) and instrumenting with lagged variables require strong justification.
Economic theory : Explain the robustness of the results in "assumption space." Differentiate assumptions that are crucial from those that merely simplify. Even if you do not prove, explain what happens if preferences are not Cobb-Douglas, or if agents are not identical. Usually include detailed derivations in an appendix for the referee.
Go for clear exposition of substance as opposed to trying to impress readers with big words, hard statistics, or fancy theory. Present the main conclusions so that they will be accessible to the nonspecialist reader in the final section.
Use footnotes sparingly, and Latin almost never. Don't rely on variable names if you can spell them out. Remind readers often of the meaning of your symbols: often replace “ q ” with "the elasticity of substitution." Readers have to expand out the entire phrase--help them out.
No article has ever suffered from too much helpful advice from colleagues. Be sure many readers look at your article. Use family, friends, colleagues from other departments: most of your paper should be understandable even to the nonspecialist.


Social Media Week/NYC Recap – SOCIAL LISTENING PANEL
bySocial Media Week is a semi-annual global conference covering all things social media-related. It runs concurrently in ten cities across globe, reaching as far as Istanbul. Of course, my home base of NYC was one of the ten cities.
JWT was one of the main sponsors and with the help of an old friend that works there (thanks soooooooo much Heather), I was able to attend the second biggest panel of the conference: "Pay Attention! Social Listening Done Right." The subject: how companies track and analyze consumer reaction to their products within the various social media channels.
The main takeaway of the panel discussion was:
Large corporations actively use social media to promote and sell products and have the resources to effectively track its return-on-investment (ROI). By their own admittance, however, they don’t know each and every social media trick and are learning something new every day. But the learning process doesn’t scare them, it excites them.
Here are the topics for this post:
- The Panel Participants
- The Audience
- The Panel Discussion Content
- Social Listening Tools
- The Limits of Social Listening
- The Solution To The Limits
- Conclusion
The Panel Participants
Pretty impressive, I’d say…
- Michael Learmonth, Digital Editor, Ad Age (Moderator)
- Kyle Monson, Senior Technology Editor, JWT
- Shiv Singh, Head of Digital for PepsiCo Beverages
- Brian Clark, CEO, GMD Studios
- Ed Sullivan, Vice President, Strategic Alliances, Radian 6
- Michael Jaindl, Chief Client Officer, Buddy Media
The Audience
Nothing really surprising here:
- a packed room as this was a sold out event.
- age-wise, most of the crowd was in their mid-thirties to early forties.
- quite a few people came with their co-workers; the most common makeup of these groups was a marketing person and a web designer/developer, the latter being the youngest member in the group.
The Panel Discussion Content
All the panelists said they used social listening to measure a variety of user statistics from Twitter, Facebook, the blogosphere, etc., then made a decision on how to best react to the stats, if they reacted at all. Singh at PepsiCo provided such an example:
For the 2011 Super Bowl, his company ran one of the first and most talked-about TV spots: the Brisk Iced Tea ad featuring an animated Eminem. While tracking response to the ad on Twitter, members of the PepsiCo social media team in New York discovered an Eminem promotional party in Brooklyn and decided to pay a visit. They arrived at the party to discover not only an extremely positive response to the ad, but also to their product.
There were some examples of how too much listening could be a bad thing, the prime example coming from Clark at GMD Studios. He recalled the story of the very early Twitter promotion of Snakes On A Plane, which occurred while the film was in post-production. Movie geeks tweeted how they thought the movie’s storyline should run. The filmmakers took the tweets to heart and, as they were in post-production, re-edited the movie to so that the storyline matched the geek’s suggestions. The result: Snakes opened to a tepid response from movie-goers; there’s no direct proof that the film was great to begin with and that the Twitter users made the film worse, but they sure didn’t make it better.
This "hit-or-miss" scenario led to a lot of agreement between the panelists. They all conceded that while social listening is an important part of the process, it’s not an exact science when it comes reaching consumers. Social networks like Facebook and Twitter may have reached critical mass on the communication level, they said, but no one has perfected the process of using them to sell products.
But they all agreed that the best way to reach consumers was by finding the best "influencers" within the social networks: people with influence and authority that can spread the word about a product if they like it. If you’ve read Purple Cow by Seth Godin (and every budding entrepreneur should read it), think of influencers as "sneezers spreading the ideavirus."
The influencers may be the brass ring that companies reach for, but every panelist was adamant that they were interested in every customer and not just the tastemakers. They "socially listen" to every response that Twitter, Facebook and the like send out. They may not react but they listen.
Social Listening Tools
Lots of applications are available for tracking social media activity and many were discussed at the panel. But the most-talked about one was Radian6.
Based out of Canada, Radian6 is slowly becoming the Nielsen of social media. It allows its clients to "listen, measure and engage in conversations across the social web." Its interface is easy-to-use, has a built-in workflow engine and tracks Facebook and Twitter; along with YouTube, Technorati, delicious and a variety of blogs and RSS feeds.
I can’t give you a hands-on review of Radian6. Since it costs $600 a month, don’t expect one from me anytime soon. They also have a few competitors that I checked out and their product may or may not be better.
But based on my research and my observations during the panel discussion, I can promise you that the following is true:
- when asked whether or not they use social listening applications, 75% of the audience said that they did.
- of the 75% that use social listening applications, 90% said that they used Radian6.
- almost all the panelists admitted to using Radian6.
- Radian6, without question, does a better job of marketing their product than their competitors.
A basic over of the company can be seen in this video:
Check out their application interface, or Engagement Console, in this video:
The Limits of Social Listening
No matter its importance and what tracking tools are out there, all the panelists agreed that the social listening process is a slippery slope. Clark said it best: "There’s a fine line between research and stalking." How much should we be listening to? What do we do after we hear things? Should we be doing anything at all?
And what about the limits of Facebook, the biggest social network out there right now? For all the public outcries about how Facebook invades our privacy, they clearly don’t share a lot of enduser information with third parties, if they share it at all. Think about it: only your approved friends can see all of your FB wall and profile content, and vice versa.
Companies have to deal with this limitation as well. 5 trillion people could "Like" Pepsi on Facebook tomorrow, but Pepsi won’t know anything about them unless the consumer lets them in, and many don’t. Not even Radian6 can track everything on FB, which Ed Sullivan, VP of Radian6 and part of this panel discussion, confirmed.
Someone on the panel cited Nielsen numbers saying that 25% of all time spent online is on Facebook. So there’s some valuable consumer data on FB, so valuable that Singh from PepsiCo suggested that Facebook CEO Mark Zuckerberg is probably "kept up at night by the fact that he didn’t make Facebook content more publicly available."
All of this led to a vigorous debate among the panelists about how to deal with the limitations.
The Solution To The Limits
Outside of utilizing Facebook Connect, which provides some information to companies about Facebook users, none of the panelists had an answer about what to do about the FB issue. But there were some agreed-upon best practices:
- Try to satisfy all customers, not just the influencers – This was already mentioned but since all the panelists couldn’t stress this point enough, it bears repeating. There is great success to be found by providing great customer service across the board.
Don’t rush to do something just because you can – Shiv Singh of PepsiCo, the most insightful one on the panel, described his three pillars of social listening: Listen. Respond. React.
According to Singh, whenever Pepsi "hears" something going with their brand inside social media, the PR, Web and Marketing departments meet as a team to discuss the next step. Sometimes they react, sometimes they don’t. But their reactions are carefully gauged.
- If your brand gets a negative reaction within the social networks, don’t respond to it unless you can fix the problem – Customers reacting negatively to your product inside the social networks is the cost of doing business. All the panelists agreed that trying to solve everyone’s problem is impossible. But they also agreed that solving a problem is one of the best ways to build customer loyalty…even if you’re building it one customer at a time. So fixing a problem that you actually can fix is always a good idea. That housewife in Idaho that simply "didn’t like" your product and decided to tell her 27 followers on Twitter about it? Well, you have to pick your battles.
Conclusion
Clark at GMD, the more philosophical panelist, posed the question: "Is social listening an expertise or a science?" The eternal question, perhaps, but it’s clearly a job that needs to get done. Whether it’s within the company or with the help of a vendor, utilize social listening whenever you can.
As I said, Heather got me into the second biggest panel of the conference. She also got me into the first one a day later: "Cross-Mobile Brand Strategy." I’ll be discussing that one in the next article.


WITNESS LIST Natural Resources Committee March 31, 1999-8:00A HB 1654 For: Baker, Allan (Self) HB 1847 For: Bowers, Richard (North Plains Ground Water Conservation District No. 2) Carlton, John J. (Central Texas Association of Utility Districts) Halbert, Wayne (Self and Texas Irrigation Council) Neighbors, Ron (Self and The Subsidence District) Oliver, Jim (Tarrant Regional Water District) Robbins, Dean (Texas Water Conservation Association) Tart, Pete (Self) HB 2815 For: Newton, Chris (Self and Texas Petroleum Marketers and Convenience Store Association) HB 2816 For: Newton, Chris (Self and Texas Petroleum Marketers and Convenience Store Association) HB 2849 For: Hernandez, Eddie (Self and Laguna Madre Water District) On: Jones, Samuel W. (Texas Natural Resource Conservation Commission) HB 3554 For: Johnson, Raymond (Port of Port Arthur) HB 3591 For: Collins, Sharlene (Steiner Ranch) SB 533 For: Duck, Tommy (Texas Rural Water Association)


The climate sensitivity parameter serves as a measure of the RF-induced change in globally averaged, equilibrium surface temperature (Box 2). Climate sensitivities for persistent contrails have been derived from equilibrium climate change simulations with two different global models, yielding 0.43 K (W m −2) −1 (ref. 76) and 0.3 K (W m −2) −1 (ref. 77), meaning that contrails induce a smaller global temperature change per unit RF than CO 2 emissions. In combination with the most recent IPCC uncertainty range in contrail RF of 5–30 mW m −2 (Fig. 7), these contrail climate sensitivities imply a global warming contribution of 0.00115—0.03 K. Both studies agree that this temperature response is only weakly correlated geographically with air traffic and dismiss previously suggested influences of contrails on decadal temperature trends over the U.S.A. 15, 78.
The contrail climate sensitivities mentioned above are at the low end of the overall climate sensitivity uncertainty across climate models 7, 0.4–1.2 K (W m −2) −1. Combining the latter range with the most recent (year 2011) uncertainty range for AIC RF, 20–150 mW m −2, leads to a highly uncertain equilibrium global warming contribution of 0.008–0.18 K due to AIC. This may be compared to the range 0.014–0.042 K due to accumulated aviation CO 2 emissions alone inferred from the associated RF of 35 mW m −2 (Fig. 1), as well as to the estimate of 0.85 (0.65–1.06) K, the global temperature increase due to all anthropogenic activities accumulated over the period 1880 to 2012 (ref. 80).
More effort is required to understand the causes of spread in AIC RF estimates across different global climate models and methodologies. Total uncertainty estimates should account for correlations between uncertainties due to different processes. Besides a more complete representation (parameterisation) of AIC, an improvement of the representation of natural cirrus in global models 61 is also needed to simulate AIC RF and its dependence on future air traffic patterns and climate change with greater confidence. Understanding forcing-response relationships in the climate system to better quantify surface air temperature changes warrants further scientific scrutiny 81. In particular, time series of AIC RF and climate sensitivity estimates for contrail cirrus are needed to better constrain the contribution of AIC to global warming.


Webmail lets you check your email from any web browser. Your webmail site is:
Your username is your whole email address.
iOS and OS X only: Open this configuration link on your iOS device or on your Mac desktop to easily set up mail (IMAP/SMTP), Contacts, and Calendar. Your username is your whole email address.
Use the following settings when you set up your email on your phone, desktop, or other device:
| Option | Value |
|---|---|
| Protocol/Method | IMAP |
| Mail server | {{hostname}} |
| IMAP Port | 993 |
| IMAP Security | SSL or TLS |
| SMTP Port | 465 |
| SMTP Security | SSL or TLS |
| Username: | Your whole email address. |
| Password: | Your mail password. |
In addition to setting up your email, you’ll also need to set up contacts and calendar synchronization separately.
As an alternative to IMAP you can also use the POP protocol: choose POP as the protocol, port 995, and SSL or TLS security in your mail client. The SMTP settings and usernames and passwords remain the same. However, we recommend you use IMAP instead.
On iOS devices, devices on this compatibility list, or using Outlook 2007 or later on Windows 7 and later, you may set up your mail as an Exchange or ActiveSync server. However, we’ve found this to be more buggy than using IMAP as described above. If you encounter any problems, please use the manual settings above.
| Server | {{hostname}} |
|---|---|
| Options | Secure Connection |
Your device should also provide a contacts list and calendar that syncs to this box when you use this method.
Your box uses a technique called greylisting to cut down on spam. Greylisting works by initially rejecting mail from people you haven’t received mail from before. Legitimate mail servers will attempt redelivery shortly afterwards, but the vast majority of spam gets tricked by this. If you are waiting for an email from someone new, such as if you are registering on a new website and are waiting for an email confirmation, please be aware there will be a minimum of 3 minutes delay, depending how soon the remote server attempts redelivery.
Every incoming email address also receives mail for +tag
addresses. If your email address is<EMAIL_ADDRESS>, you’ll also automatically get mail sent to<EMAIL_ADDRESS>. Use this as a fast way to segment incoming mail for your own filtering rules without having to create aliases in this control panel.
Your box sets strict email sending policies for your domain names to make it harder for spam and other fraudulent mail to claim to be you. Only this machine is authorized to send email on behalf of your domain names. If you use any other service to send email as you, it will likely get spam filtered by recipients.


1.1. Safeguarding the privacy of our website visitors is carried out in accordance with this Privacy Policy (policy). This policy is an integral part of the Terms of use of our website.
1.2. Unless otherwise explicitly defined in this policy, the expressions used herein shall have the respective meanings as defined in the Terms of use.
1.3. Our website uses cookies and when you first access our website you will be asked to consent to the use of cookies according to this policy. Access or use of our website or Services shall be deemed conclusive and sufficient evidence of your consent to this policy.
2.1. By accessing or using our website you agree and represent that the following types of personal data (information) may be collected, processed and otherwise used by us:
(i) your location, browser type, browser version, operating system, referral source, length of visit, your IP address, page views and navigation paths, as well as other information about your computer and about your use of and visits to our website;
(ii) your email address and other data supplied by you while using our website, such as the details of your profile/account that may include name, gender, date of birth, pictures, nationality, address, interests, educational details and employment detail;
(iii) any communication and details contained therein that you send, post or otherwise disclose via our website, including metadata associated with the communication.
2.2. By accessing or using our website you represent and warrant that you have obtained proper consent by any other person whose personal data you disclose to us, including for the purposes of storing, processing and otherwise using of such data according to this policy.
3.1. Personal data provided to us via our website will be used for:
(i) Administering our website and for personalizing our website for you;
(ii) the purposes of using of the Services and other resources of our website, including for the provision of respective deliverables, newsletters, notifications, etc.;
(iii) Documentary exchange;
(iv) Monitoring compliance with rules that govern the use of our website;
(v) Marketing and non-marketing communications which we deem might be of your interest;
(vi) Processing and provision of information of statistical nature about our visitors to third parties (with no particular identification of individual users);
(vii) Administration of enquiries and complaints relating to our website;
(viii) Our website securit reasons, prevention of fraud and unauthorized access or actions;
(ix) Provision of assistance to official authorities to the extent required by the applicable laws.
3.2. If you would like us to discontinue sending you standard correspondence such as newsletters or other notifications, please make sure you explicitly let us know via email communication;
3.3. You can adjust your privacy settings using privacy controls on our website.
3.4. Your personal data will not be disclosed to any third party for the purpose of any third party’s direct marketing. Personal data may be used for the purposes specified in this policy or as indicated on relevant pages of our website.
4.1. Your personal data will not be subject to disclosing to third parties, except as provided in this policy.
4.2. By accessing or using our website you agree that your personal data may be disclosed by us:
(i) to the extent required by the applicable law; or
(ii) with respect to ongoing or prospective legal proceedings, including in order to ascertain, exercise or defend our legal rights, or for the purposes of fraud prevention and/or reducing credit risk; or,
(iii) to our employees, officers, insurers, professional advisers, related companies, affiliates, subsidiaries, suppliers or subcontractors as reasonably necessary for the purposes set out in this policy and on a need-to-know basis.
5.1. Transfer of personal data between countries is made according to the applicable laws and in accordance with this policy. You understand and agree that your personal data collected may be stored, processed, and transferred between countries in which we operate in order to enable the use of the data according to this policy.
5.2. You are aware that personal data published or otherwise freely disclosed by you via our website may be available, via the internet, around the world. Use of such data by others may not be prevented.
5.3. Furthermore, you understand and agree that data collected may be transferred to or transmitted via countries which have not introduced data protection legislation equivalent or at least similar to those effective in the European Union.
5.4. You expressly agree to the transfer of personal data as governed in this Article 5.
6.1. The personal data provided by you will be stored on our or our service providers secure servers (operating under password and firewall protections). In case data is stored on our service provider infrastructure, we may not ensure or enforce protective measures other than these already undertaken by them. We take reasonable technical measures designated to prevent the loss, misuse or alteration of personal data.
6.2. You acknowledge that:
(i) you are aware of the fact and accept that our website utilizes hyperlinks to, and details of, other websites, including websites of third parties;
(ii) we are not responsible for the privacy policy and practices of any third party;
(iii) interacting via the Internet (including transmitting any data) is, as a rule, insecure, and there are no guarantees as to the security of any data you communicate over the Internet;
(iv) you will keep your personal data at our website updated to ensure the Services are rendered and supplied to you appropriately;
(v) we are not responsible for whatsoever having arisen out from inappropriate rendering of information to us, neither for having any information not updated;
(vi) you are responsible for keeping the password for accessing our website confidential. You password is necessary for logging into your account/profile at our website (if you have created such an account/profile).
6.3. We may provide you with the personal data we have available about you, subject to:
(vi) the supply of appropriate evidence of your identity and authority to request for such data; and,
(vii) payment a fee to us that we will be free to designate depending on the extent, substance and type of your request.
7.1. We will not keep personal data longer than necessitated by the purposes set out herein.
7.2. Notwithstanding any provision hereof, you expressly agree that electronic and other documents containing personal data may be retained by us:
(i) to the extent required by the applicable law; or
(ii) with respect to ongoing or prospective legal proceedings, including in order to ascertain, exercise or defend our legal rights, or for the purposes of fraud prevention and/or reducing credit risk.
8.1. This policy is modified the same the Agreement is modified.
8.2. You should periodically review the provisions hereof to ensure you are acquainted in detail with the policy, including any changes thereto.
9.1. A cookie is a file containing a string of letters and numbers that are sent by a web server to a web browser and are stored by the web browser. Such string of letters and numbers sent back to the server each time the browser requests a page from the server. More information of cookies (types, manner of operation, etc.) is available at: https://en.wikipedia.org/wiki/HTTP_cookie.
9.2. Although, as a rule cookies do not contain data that identifies a visitor, certain personal data that is kept about you with us may be linked to the data pertaining to the cookies.
9.3. You can delete cookies stored by your browser or you can block cookies (by the controls/settings of your web browser). Deleting cookies, blocking cookies or refusing the use of cookies may have a negative impact upon the use of many websites. If you block or delete cookies, the functionalities of our website will be affected, highly restricted or even could be unusable.
10.1 You can see our identification details at Contacts section of our website.
10.2 In regards to our privacy policy you may contact us by sending us mail to email@email.com.


Key management procedures should be implemented to require the retirement of old keys. Keys and passwords that have been used previously should never be used again.
Retiring old keys ensures that unauthorized disclosure of old keys by former employees does not facilitate a compromise.
Perform the following steps to make sure that old encryption keys are retired:
Examine policy. Review the key management procedures in the information security policy to make sure they include provisions for archiving and revocation of previously used encryption keys.
Conduct interviews. Interview the responsible staff members to make sure that the key management procedures are implemented as stated.
Use the following steps to make sure that old encryption keys are retired:
Define procedures for managing old encryption keys. Define a procedure for archiving old encryption keys. Define a procedure for revoking old encryption keys.
Implement procedures for managing old encryption keys. Implement the chosen procedures for the archiving and revocation of old encryption keys using technology. You may need to add this functionality to your software if you don't have it already.
Update documentation. Document the mechanisms for archiving and revocation of old encryption keys.


Fantastical Beasts
Guide
Drag the beast below to order them from most to least likely to exist:
Most –––
Zombies
Yeti
Angels
Demons
Santa Claus
Dragons
Pixies
Ghosts
Harpies
Elves
Mermaids
Giants
Leviathan
Pegasus
Centaurs
Unicorns
Loch Ness Monster
Tooth Fairy
Phoenix
Werewolves
Vampires
Genies
Least –––


SourceCodeEditor supports code autocomplete provided by the Suggester class. By default Ctrl+Space and dot (".") triggers a suggester.
SourceCodeEditor
Suggester


Large Scale Assignment 1: Ray Tracing (120 Points)
Due Wednesday 10/30/2019 at 11:59PM
Intermediate "Check-In" Deadline on Friday 10/18/2019 (50 points in part 1)
Overview
This assignment will walk students through the construction of a real time ray tracer using a mix of Javascript and GLSL. All of the assignments we have done so far have built up to this point! Since we are using GLSL, all rays are traced in parallel, which makes this substantially faster than a CPU implementation of ray tracing. (NOTE: This was heavily inspired by a recent assignment in Princeton's computer graphics class, which is a modern version of the assignment I did a decade ago in the same class). You should expect this assignment to be very challenging and painful at times, but it is also incredibly rewarding. So stick with it! I will have an 8 hour hackathon with food sometime the weekend before it's due to help everyone.
Scoring
This assignment is out of 120 points. 85 of these points are required tasks that everyone has to do. Beyond that, there are 100 points up for grabs which you can choose from to pursue your interests and "make the assignment your own." Any points that you get beyond 35 will apply to extra credit at a rate of 1 point, 4/5 points, 4/5^2 points, 4/5^3 points, etc. The required points and the optional points will be graded independently. So, for instance, if you get an 80/85 on the required points and you earn 50 optional points, then your final score will be 80 + 35 + 4.8 = 119.8/120 points, which is quite a formidable score!
Collaboration
Since this is a very intense assignment, you are allowed to work very closely with other students in the class in a "buddy" capacity, and even to look at each others' code as you're debugging. But I expect each student to submit their own code. Please indicate to me on your README who your buddies were.
Getting Started
-
Click here to download the repository of skeleton code for this assignment. Note that you will also need to download the most recent version of ggslac and place it at the root of the LargeScale1_RayTracer assignment. If you have git installed on your computer, you can simply type
git clone --recursive https://github.com/Ursinus-CS476-F2019/LargeScale1_RayTracer.git
NOTE: You will only need to edit
raytracer.frag
to complete all of the tasks in the assignment. - If you haven't already, follow the directions to get the local Python web server working on your computer (click here to see these directions in the scene graphs assignment). If the Python server totally craps out on you, you can check out Xaamp.
Debugging GUI
The main file where you view the results of your ray tracer is RayViewer.html
. In this file, you can switch back between your ray tracer and the standard object-first shader with Lambertian and specular Blinn-Phong shading. You can use the object-first view to help you debug. The GUI also allows you to change the positions and colors of lights and cameras real time.  Below is a screenshot of the object-first view.
And below is an example of a ray tracer with all of the required tasks and some of the optional tasks:
Scene Graphs:
This assignment uses JSON scene graphs to specify virtual worlds. Please refer to Mini Assignment 2 for more details on the syntax. By default, the scene graph sample-scene.json
(pictured above) is the scene that's loaded. This has all features that you would want to show across all required tasks, and most features you would want to show for the optional tasks (except for cylinders and cones). Have a look at that file for example syntax. Note that can also edit the parameters of the lights and materials real time in the debugging GUI.
General Tips:
- Write your shaders one step at a time! Debugging is very difficult because the only output is a color per pixel. Try to use the colors to help you debug. Some more specific suggestions will be provided in each task.
- If your shader doesn't compile, drop into the debugging console to see why. Syntax error messages will be printed there with line numbers in the shader. Step 1 is definitely just getting things to compile!
- As your shader gets longer, the compile time may increase. This will be particularly noticeable when you use more reflections. So keep the number of reflections to a minimum when you start off.
-
If your shader doesn't update, you may need to do a "hard refresh" and reset your cache. This seems to happen particularly in Google Chrome. The keyboard shortcut for this is
CTRL+SHIFT+R
-
When you write a loop, you cannot have a variable number of iterations. So you will have to have a maximum number of iterations, and then
break
when appropriate (you can use break here!). I have tried to take care of most of these kinds of loops for you, but if you decide to do loops in one of the tasks, be mindful of this. -
If you get an error like the following
Then it probably means you need to write a number as a decimal. There is no explicit casting, so when GLSL seesERROR: 0:15: '+' : wrong operand types - no operation '+' exists that takes a left-hand operand of type 'const int' and a right operand of type 'mediump float' (or there is no acceptable conversion)
10
, for instance, it assumes it's an integer. So you would need to write10.0
Submission Instructions
You will submit all of yourraytracer.frag
code to Canvas when you are finished, along with any screenshots or videos for the art contest. Please also submit a README.txt
file with both submissions with the following information:
- Your name
- The "buddies" you worked with (see collaboration above)
- A list of tasks that you implemented, and how many points you believe you earned.
- A description of your art contest submission if you have one, as well as:
- One of the two statements below
- "I consent to have my art contest submission posted publicly on the class web site. My name/pseudonym for public display is                      .
- "I do not wish to post my art contest submission publicly"
- One of the two statements below
- Approximately how many hours it took you to finish this assignment (I will not judge you for this at all...I am simply using it to gauge if the assignments are too easy or hard)
- Your overall impression of the assignment. Did you love it, hate it, or were you neutral? One word answers are fine, but if you have any suggestions for the future let me know.
- Any other concerns that you have.
Part 1: Ray Casting / Ray Object Intersections: Required Tasks
NOTE: By default, once you finish these tasks, the shapes whose intersects you implement properly should show up as pixels colored by the normal of the intersection. You will do more advanced shading based on lights, shadows, reflections, and transmissions in part 2.
Perspective Ray Casting (10 Points)
Given the uniform variables below that describe the camera and the attribute vec2 v_position
, construct a ray through the scene corresponding to this fragment, assuming a perspective camera
Camera Uniforms Passed from RayViewer.html:
vec3 eye
: The origin of the cameravec3 right
: The right direction of the cameravec3 up
: The up direction of the camerafloat fovx
: The field of view in the right/towards planefloat fovy
: The field of view in the up/towards plane
Code To Write
You should fill in the appropriate section of thegetRay()
function.
Tips
- You are given the
right
vector and theup
vector. Use an appropriate cross product (thecross
function in GLSL) to get thetowards
vector, via the right hand rule. You will know very quickly if you got it backwards... - Once you start to intersect rays with objects in the scene, things will be drawn to the ray canvas. At this point, if you've done this task correctly, the shapes should show up at exactly the same positions on the screen as they do on the object-first canvas. So if you made a mistake, you will see the shapes move when you switch back and forth between the two canvases.
Ray Intersect Triangle (10 Points)
Given a ray and three points spanning a triangle, find the intersection point and normal of the intersection of the ray with that triangle
NOTE: In the default scene, there are two square that are drawn. Every polygon in a scene is divided up into triangles via a triangle fan, so these squares will show up once you finish this task.
Code To Write
You should fill in the appropriate section of therayIntersectTriangle(...)
function. You will return t
, the ray parameter of intersection. You will also return the intersection point and normal by reference (an "out" variable in GLSL). See the parameters for more details. You only need to use MInv
and N
when you get to the transformation instancing task.
Tips
- A function to intersect a ray with a plane,
rayIntersectPlane(...)
is provided to you as an example, and you should definitely make use of this as a subroutine in your implementation. - It might be helpful to make a function that returns the area of a triangle spanned by three points, and to use the area ratio method you implemented in mini assignment 1 to check that the plane intersection point is inside of the triangle.
Below are some screenshots from a working implementation, using color by normal (there are 4 triangles in view: two for each rectangle)
Object-First View |
Ray View with color by normal |
Ray Intersect Sphere (10 Points)
Given a ray and a sphere, find the intersection point and normal of the intersection of the ray with that sphere
Code To Write
You should fill in the appropriate section of therayIntersectSphere(...)
function. You will return t
, the ray parameter of intersection. You will also return the intersection point and normal by reference (an "out" variable in GLSL). See the parameters for more details. You only need to use MInv
and N
when you get to the transformation instancing task.
Tips
- This is exactly the same as the ray intersect sphere task from mini assignment 1. The only difference is that you also need to return the normal of the intersection, and you're only ever returning one point of intersection, which is the closest (so the nonnegative root with the smallest t value.
Below are some screenshots from a working implementation, using color by normal (NOTE: instancing has also been implemented for the left and middle spheres)
Object-First View |
Ray View with color by normal |
Ray Intersect Axis-Aligned Box (10 Points)
Given a ray and an axis-aligned box with a particular center/length/width/height, find the intersection point and normal of the intersection of the ray with that box
Code To Write
You should fill in the appropriate section of therayIntersectBox(...)
function. You will return t
, the ray parameter of intersection. You will also return the intersection point and normal by reference (an "out" variable in GLSL). See the parameters for more details. You only need to use MInv
and N
when you get to the transformation instancing task.
Tips
- The fact that this is intersecting a ray with an axis-aligned box makes this much easier. You should intersect with the 6 faces. You can use the
rayIntersectPlane
function to help if you'd like. - It may be easy to add code to handle one face at a time. You will then see the box come into view one piece at a time.
- Since this is a convex 3D surface, a ray may intersect two faces. Make sure you're returning the intersection of the closest face to the ray.
Below are some screenshots from a working implementation, using color by normal (NOTE: instancing has been implemented for the right box, since it has been rotated and is no longer axis-aligned)
Object-First View |
Ray View with color by normal |
Ray Instancing for Transformations (10 Points)
Take into consideration a transformation matrix M that should be applied to an object before viewing. In every rayIntersectX(...)
function, a 4x4 matrix MInv (the inverse of M) and a 3x3 normal matrix N are passed along, which you can use to do this task. For full credit, you should apply this to all the shapes for which you've written intersect code
Code To Write
You should add some code to eachrayIntersectX(...)
function to deal with this, where X can be triangle/sphere/box/cone/cylinder.
Tips
- Transform the ray (p0, v) so that the new endpoint of the ray is MInv*(p0, 1.0) and the new direction is MInv*(v, 0.0) (i.e. only apply the translational part of MInv to p, not to v). You can then use this t on the original endpoint and direction to obtain the final intersection point. You will still have to apply the normal transformation N to the normal you get.
- Refer to Chapter 13.2 for more information about this process
Part 1: Ray Casting / Ray Object Intersections: Optional Tasks
Orthographic Ray Casting (5 Points)
Cast rays all with the direction v
= towards
, and change the eye to move along the right
and up
directions, as discussed in class
Code To Write
You should fill in the appropriate section of thegetRay()
function.
Tips
- You can toggle orthographic viewing in the "ray tracing options" menu in the debugging GUI.
Ray Intersect Cylinder (10 Points)
Given a ray and an axis-aligned cylinder with a particular radius, height, and center, find the intersection and normal of the ray. The center coincides with the center of the circular cross section halfway up the cylinder.
Code To Write
You should fill in the appropriate section of therayIntersectCylinder(...)
function. You will return t
, the ray parameter of intersection. You will also return the intersection point and normal by reference (an "out" variable in GLSL). See the parameters for more details.
Tips
- Have a look at some notes I wrote 10 years ago when I was working on my first ray tracing assignment.
Ray Intersect Cone (10 Points)
Given a ray and an axis-aligned cone with a particular radius, height, and center, find the intersection and normal of the ray. The center of the base coincides with the center.
Code To Write
You should fill in the appropriate section of therayIntersectCone(...)
function. You will return t
, the ray parameter of intersection. You will also return the intersection point and normal by reference (an "out" variable in GLSL). See the parameters for more details.
Tips
- Have a look at some notes I wrote 10 years ago when I was working on my first ray tracing assignment.
Part 2: Illumination/Materials: Required Tasks
Blinn-Phong Shading (15 Points)
Given a ray, an intersection point/normal, material properties of the intersected object, and a set of lights in the scene, add the Blinn-Phong contribution (diffuse + specular) of each light. The basic equation of the final color C at the fragment for L lights is below
\[ C = \sum_{i = 1}^L c_i \left( k_d(\vec{N} \cdot \vec{\ell_i^N}) + k_s(-\vec{v} \cdot \vec{h_i})^s \right) \]
And the equation for a light with attenuation is\[ c_i = \frac{I_0}{c_a + \ell_a d + q_a d^2} \]
where-
I0 is the original color of the light (the
color
field of theLight
struct) -
d is the distance of the light to the point of intersection (the position of the light is the
pos
field of theLight
struct) -
ca, la, and qa are constants (found as the x, y, and z components, respectively, of the
atten
field of theLight
struct).
- The diffuse coefficient
kd
and the specular coefficientks
can be found as fields of the material structm
that's passed into the function
Code To Write
You should fill in code in thegetPhongColor(...)
function.
Tips
- You should have a loop up to
MAX_LIGHTS
and index into the uniform listlights
, but break out of the loop before you reachnumLights
(this is the weird way we have to loop in GLSL). - The object-first fragment shader in ggslac has a lot of code that you can adapt to this function for each light in the loop.
Below are some screenshots from a working implementation. Note that the object-first view only uses the first light in the list, so there is a slight difference with the ray tracer (it is richer with more lights), but the overall effect is the same
Object-First View |
Ray View |
Point Light Shadows (10 Points)
When applying Blinn-Phong shading, only include a light if it is not blocked by an object in the scene. You can accomplish this by tracing a new ray from the point of intersection of the material towards the light (using rayIntersectScene
), and seeing if it hits anything before it gets to the light.
Code To Write
You should fill in thepointInShadow(...)
function. You should then call this function from the appropriate place within getPhong(...)
Tips
- Be sure to add
EPS
times the direction to the initial point on the ray before shooting it towards the light. This is an effective hack to prevent the first object from being intersected as the object we're illuminating! Below is a screenshot of the kind of bug you will get if you forget to do this:
Below are some screenshots from a working implementation.
Object-First View |
Ray View |
Mirror Material Reflections (10 Points)
If a ray hits a material with a nonzero ks
term, reflect the incoming ray at the perfect angle about the normal, and continue tracing the ray through the scene. In addition to the Phong light of the material, you should accumulate any light that makes it back from this reflected ray, scaled down by the ks
term.
Code To Write
Fill in appropriate parts of the "recursive" loop in themain()
function. You should accumulate a weight term as a product of ks
terms as you go along. this weight term gets multiplied as an additional factor on front of Phong colors at each iteration.
Tips
- You should increase the
MAX_RECURSION
macro to include multiple bounces. But be warned, the compile time increases substantially as you increase this number. So start it off around 2 as you're debugging, so you at least get one reflection - The reflect function in GLSL may come in handy in this task
- As with the shadows, be sure to add
EPS
times the direction to the initial point on the ray before shooting it at the perfect angle out.
Below are some screenshots from a working implementation with MAX_RECURSION
as 3 (up to second order reflections), with the purple "looking glass" sphere that's placed at the top of the scene. The reflection of objects off of the rectangular mirror and again off of the sphere are visible.
Object-First View |
Ray View |
Part 2: Illumination/Materials: Optional Tasks
Spot Lights (10 Points)
In addition to the shadow term, also restrict a light so that it only illuminates parts of the scene that are within a cone determined by a direction vector and a maximum angle that light rays are allowed to make with that vector.
Code To Write
Add some code inside the light loop in thegetPhongColor(...)
function that checks the angle that the light ray makes with the towards
field of the light struct, and compares it with the angle
of the light struct.
Below is a screenshot from a working ray tracer implementing this.
Box Checkerboard Pattern (10 Points)
Create a checkerboard pattern on a box if the special
field of its material is activated.
Code To Write
Add some code inside the light loop in therayIntersectBox(...)
to record a number between 0 and 1 which gets added on as a term in front of the diffuse term kd
. Store this number in the sCoeff
field of the intersect
term. Then use this term in the getPhongColor(...)
function in front of the diffusion coefficient if the special
flag of the material is 1.
Tips
- The function \[ cos(x)cos(y) \] over two different coordinates x and y gives an "egg carton" pattern. You simply need to threshold this so that
sCoeff
gets a 0 if this product is negative, or a 1 if this product is positive. See below:
Below is a screenshot of a box with the special material enabled.
Sphere Checkerboard Pattern (10 Points)
Create a checkerboard pattern on a sphere if the special
field of its material is activated.
Code To Write
Add some code inside the light loop in therayIntersectSphere(...)
to record a number between 0 and 1 which gets added on as a term in front of the diffuse term kd
. Store this number in the sCoeff
field of the intersect
term. Then use this term in the getPhongColor(...)
function in front of the diffusion coefficient if the special
flag of the material is 1.
Tips
- You can use the spherical coordinates of the intersection point to help you (see textbook 11.2 for another reference on this). Let the normal be as such: \[ \vec{n} = (n_x, n_y, n_z) \]
Then let
\[ \phi = \cos^{-1}(n_z) \]
and
\[ \theta = \tan^{-1}(n_y/n_x) \]
Then you can take \[ \cos(n\phi) \cos(n \theta) \]
for some integer n to wrap the checkerboard around the sphere n times along the azimuth and elevation. (Actually, you should call
atan(n.y, n.x) to compute theta
)
Below is a screenshot of a sphere with the special material enabled.
Transmission with Refraction (15 Points)
If any of the components of the transmission coefficient kt
of a material are greater than zero, then perform a transmission instead of a reflection (since we can only do tail recursion in GLSL); that is, shoot a ray through the material in a direction determined by Snell's law
\[ \nu_i \sin(\theta_i) = \nu_j \sin(\theta_j) \]
where thetai is the incident angle, and thetaj is the transmitted angle on the other side. You can assume that the refraction index nu outside of the material is 1, and the refraction index inside of the material is the refraction
field of the material struct.
Code To Write
Fill in appropriate parts of the "recursive" loop in themain()
function. You will be adding something in addition to the code you have to do reflections, and you will be doing one or the other (so have an if statement to do either reflection or refraction). You should accumulate a weight term as a product of ks
and kt
terms as you go along, depending on whether you decide to reflect or rract, respectively.
Tips
- Section 13.1 of the book has some good suggestions of how to implement refraction in the context of a ray tracer.
-
Remember that the indexes of refraction flip when you're on the inside or the outside, so be sure to pay attention to the
insideObj
flag in the reflection/transmission loop.
Soft Shadows (15 Points)
Implement soft shadows based on area lights by randomly sampling rays from the point of intersection to a spherical neighborhood around the light location. You can use the uniform beaconRadius
as the radius of the sphere, since that's the radius with which the lights are rendered in the GUI.
Code To Write
You should write something likepointInShadow(...)
function, but which returns a floating point value between 0 and 1 instead of a boolean. You should then call this function from the appropriate place within getPhong(...)
and scale the light color by this value.
Tips
- Section 13.4.2 of the book has a good description of soft shadows.
- One of the trickiest parts about this task is randomly sampling. GLSL has no random functions in it, so you'll have to do something like this or like this.
- The shadows will look better the more random samples you take, but the rendering engine will slow down substantially once you exceed 20 or so samples. So you might want to position your camera with a lower number of samples, save it in the scene, and then reload the scene using a higher number of samples for the art contest.
Below is a GIF of a working implementation of soft shadows using the first random sampling technique, with an increasing number of random samples per pixel
Part 3: Other Optional Tasks
Antialiasing (15 Points)
Implement antialiasing to get rid of the "jaggies" that occur on boundaries of objects, by randomly sampling rays with some "jitter" around the initial ray.
Code To Write
You should replace the singlerayIntersectScene(...)
call in the main()
function with multiple calls to rayIntersectScene. So you will want a nested loop inside of the recursion loop.
Tips
- Section 13.4.1 of the book has a good description of antialiasing. This is similar to soft shadows task in many ways.
Something Else (5-20 Points)
Implement something I hadn't thought of! Possible ideas include a fisheye lens, depth of field effects, or some material other than a checkerboard, such as a solid noise (11.1.3) or a turbulent material (11.1.4).
Art Contest Submission (5 Points)
You just created an amazing rendering engine. Do something creative with it! The winner will get 5 points of extra credit tacked onto the end of their final score. You should submit an appropriate scene file along with your submission, as well as several screenshots of your scene from different angles that really show it off.


9:41
Place
Plan
Home
Me
Search
Vancouver
Seoul
Hangzhou
Los Angeles
New York
Miami
Beijing
Top Searches this Month
Toronto
Shanghai
Tokyo
Fukuoka
You recently viewed
Seoul
Tokyo
Shanghai
Hong Kong
Featured
Good Plans to Bangkok
Top Places in
Singapore


Toggle navigation
B@M SHOP
Post
Withdraw
Account
Connected to network:
N/A
Wallet:
N/A
Balance:
N/A
Resources
Truffle
Solidity
Javascript
×
Post
Submit
Macbook Pro
Name
:
N/A
ID
:
N/A
Price
:
N/A
ETH
Owner
:
N/A
Buy
Delete


Although EUPAN toolbox integrates 10+ softwares, most of these softwares can be provided to the main program when the specific tool is selected. It is convenient for users working on supercomputers. To run the main program of EUPAN toolbox, you only need R and a few R packages.
R 3.1 or later
R is utilized for visulization and statistical tests in EUPAN toolbox. Please install R first and make sure R and Rscript are under your PATH.
Download R here.
R packages
Several R packages are needed including ggplot2, reshape2 and ape packages. Follow the Installation step 3 or you can install the packages by yourself.
Download the EUPAN toolbox here.
Uncompress the EUPAN toolbox package.
tar zxvf EUPAN-v0.3.tar.gz
Install necessary R packages.
cd EUPAN Rscript installRPac
Compile the source codes.
make
You will find executable files: ccov and bam2cov in bin/ directory.
Now all tools except QUAST have been installed. Next we'll install QUAST
cd ../tools/ tar -zxvf quast-3.2.tar.gz cd quast-3.2 python quast.py --test cd ../EUPAN/
Add bin/ to PATH and add lib/ to LD_LIBRARY_PATH.
To do this, edit your path in the following text and add the text to ~/.bash_profile
export PATH=$PATH:/path/to/EUPAN/bin: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/EUPAN/lib/: export PERL5LIB=$PERL5LIB:/path/to/EUPAN/lib/:
and run
source ~/.bash_profile
Test if EUPAN toolbox is installed successfully
eupan
If you could see the following content, congratulations! EUPAN toolbox is successfully installed. If not, see if all the requirements are satisfied; or you may contact the author for help.
eupan tool list: qualSta View the overall sequencing quality of a large number of files trim Trim or filter low-quality reads parallelly alignRead Map reads to a reference parallelly sam2bam Covert alignments (.sam) to sorted .bam files bamSta Statistics of parallel mapping assemble Assemble reads parallelly assemSta Statistics of parallel assembly getUnalnCtg Extract the unaligned contigs from nucmer alignment (processed by quast) rmRedundant Remove redundant contigs of a fasta file pTpG Get the longest transcripts to represent genes geneCov Calculate gene body coverage and CDS coverage geneExist Determine gene presence-absence based on gene body coverage and CDS coverage subSample Select subset of samples from gene PAV profile gFamExist Determine gene family presence-absence based on gene presence-absence bam2bed Calculate genome region presence-absence from .bam fastaSta Calculate statistics of fasta file


It can be hard to restrict calories when all you want is a cup of ice cream or a glass of wine. People may think that restricting calories is the most effective way to lose weight, but successful studies involving intermittent fasting seem promising as well.  Fasting can get a bad rep but people should think again before dishing it aside.
To put it in perspective, our ancestors were not able to wake up and eat breakfast right away. They would have to spend time exerting energy to hunt for their food. Fast forward several centuries, fasting is still a part of our daily routine. When obesity was not as prominent as it is today, people would eat 2-3 meals a day from 7am -7pm, then not eat until the next day. This is a 12 hour fasting period. These people are listening to their bodies and not being tempted by all the commercial snacks that have crept into today’s life. The word “breakfast” comes from “breaking fast.” This meal is so important because it is about when you, literally, break your fast which may not always be the second you wake up.
TYPES OF FASTING
There are several different types of intermittent fasting. The most common and practical type of fasting is the 16:8 fasting. You eat for 8 hours of the day and fast for 16. Sticking your sleep period between four hours of fasting in the morning and night can help reach that 16 hour fast. Some people prefer an early dinner or skipping the morning meal and eating around 2. Depending on if you’re a morning or night person, find what is right for you.
The other type is 20:4. Same thing but 20 hours of fasting and eating for 4. This fasting can be done 3-4 times a week.
Lastly, the 24 hour fast. Typically done twice a week. More willpower is required for this as you are up and about during the fasting period without eating for awhile. If it works for you, go for it!
WHY FAST
During fasting, it is time for your body to clean itself when having a break from eating all the time. This process is known as autophagy. This is when the body cleans itself and the cells digest and remove old and dysfunctional proteins that build inside the cells. Other benefits include an increase in the human growth hormone. Insulin levels are low which makes stored body fat more easily accessible and helps people lose more weight in a healthy, natural way. Longevity can increase, and intermittent fasting can protect against disease due to changes in the functions of genes as well.
TIPS TO FAST
Fasting takes some adjustment. You may have to get used to skipping breakfast, realizing you are not hungry or eating an early dinner. Once you adjust you’ll feel better and realize you are not losing energy through fasting. The goal is to keep insulin levels low. While water is fine during fasting periods, drinks with carbs and protein are not. However, healthy fats such as avocado oil and healthy butter will not spike insulin levels and are ok to add to black coffee, for example. Be sure to stay clear of vegetable oil.
The hormone in our body that controls hunger is called ghrelin. When hungry, ghrelin increases. After time without eating, the spike of ghrelin will go back down to balance out and you may not feel that hunger pain anymore even though you have not eaten in awhile. Keep that in mind when fasting. During the spike, have your coffee with healthy butter and know you won’t have this pain because the hormone will subside.
During the fasting period, you want your “breakfast,” whenever it is, to have 50% fat and greens ideally (Check out Collagen blog post for two great smoothies by No Bread linked on the bottom). This will give you a good source of energy. Alcohol is fine during the eating period. Remember to focus on the most important meal “breaking the fast.” Here you want to pack the meal with healthy fats because not all fats are bad.
My experience
I have experimented with intermittent fasting (16 and 8 period) and never felt I was losing energy or muscle because of it. In fact, not eating before bed helped me sleep better. I prefer eating an earlier dinner and carrying around my water bottle, like I normally do, to keep me distracted because I know late at night I am not actually hungry. Lastly, as far as working out goes, you want to work out during the fasting period to optimize the fat loss. I did not fast for fat loss. Instead, I did it for the other incredible health benefits that it offers. I would workout first thing in the morning and have a big breakfast/lunch afterwards. This routine worked for me, and I felt like I had energy during my workouts and especially enough energy for the day.
Resources
The Skinny Confidential Podcast with Jorge Cruise
The Genius Life Podcast by Max Lugaverge: How to Fast for a Faster Metabolism with Dr. Jason Fung


Rebuild a package
npm rebuild [<name> [<name> ...]]
npm rb [<name> [<name> ...]]
<name>
:
The package to rebuildThis command runs the npm build
command on the matched folders. This is useful
when you install a new version of node, and must recompile all your C++ addons with
the new binary.


You can go hover those buttons
Large
Medium
Small
Xsmall
Oh, it also work with bootstrap colors
Default
Primary
Info
Warning
Danger
Success
Eventually, it's nice with icons
Print
And it works with dark backgrounds : use -alt to display it white
Hey baby
Print


It is a communication platform that helps educators reach students and parents where they are.
It offers students fun learning games and cool quizzes anywhere and anytime.
It helps teachers build a positive classroom culture by encouraging students and communicating with parents.
It allows teachers to create assignments, deliver them to students, receive results, and provide individualized feedback in real-time.
It empowers students to create, reflect on, collaborate, and share their digital portfolio.
It introduces students to amazing and endangered species and the work WWF does for them.
It is an interactive whiteboard that let students visualize, share, and grow ideas in a collaborative space.
It scans mathematical equations and solves them with a detailed step-by-step instructions.
It is a spy-themed game that transforms math drills into a global learning adventure.
It helps students to can draw, animate, and narrate their own cartoons for storytelling.
It is a phonics and reading game that’s helped many children learn to read.
It is a professional drawing app for anyone who likes to capture their ideas in digital form.
It allows students to explore the latest images, videos, mission information, news, feature stories, and tweets about NASA.
It is a website that hosts many educational games related to civic education.
It allows students to navigate around the interactive 3D globe and discover the rich wonders of our planet.


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
public interface PermanentRemoteValueMapping
A RemoteValueMapping
that outlives suspend/resume cycle of debugger.
It represents both remote pointer table and local property caches.
The remote table should be explicitly deleted when the mapping is no longer used.
The table has a unique id.
| Method Summary | |
|---|---|
RelayOk |
delete(GenericCallback<java.lang.Void> callback,
SyncCallback syncCallback)
Asynchronously deletes mapping on remote VM. |
JsEvaluateContext |
getEvaluateContext()
Returns JsEvaluateContext that is tied with this RemoteValueMapping . |
java.lang.String |
getId()
|
| Methods inherited from interface org.chromium.sdk.RemoteValueMapping |
|---|
clearCaches |
| Method Detail |
|---|
java.lang.String getId()
RelayOk delete(GenericCallback<java.lang.Void> callback, SyncCallback syncCallback)
RemoteValueMapping
must be used after this call.
JsEvaluateContext getEvaluateContext()
JsEvaluateContext
that is tied with this RemoteValueMapping
.
By default all evaluate result values will use this RemoteValueMapping
.
(This can be overriden by EvaluateToMappingExtension
).
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Role: All
Language: Processing
Bubbles is a graphics application designed for quickly drawing objects using lines and paths made of circles, and saving the image for printing.
Bubbles uses a simple follow behavior to uniformly draw a path of circles. The application also has a responsive design to fit any window resolution, several options, and pdf exporting.


--- layout: default title: Bigger Than Yourself section: syllabus ---
This course aims to challenge students to explore issues of visual form and verbal message within the physical environment. It is a reaction against the graphic designer's focus towards shrinking viewports and hand-held objects. Throughout the semester we will discuss the differences between private and public reading experiences and the opportunities for graphic designers to work in ways that dramatically interrupt or enhance architectural space.
Assignments will be given in the form of prompts. These prompts will be framed as a set of constraints paired with a series of questions. It will be up to the student to address these prompts with messages, contents, or stories of their choosing. In order for students to be successful it will be critical they have a passionate stake and strong point of view in the messages and experiences they are crafting.
The prompt serves as a focusing mechanism, to channel our collective energies into a shared set of challenges and issues. It is through discussing these obstacles and solutions that we all as a group can grow in our understanding of what it means to make work in this way.
Class time will be a mixture of group critiques, individual consultations, group discussions, demonstrations, workshops, and dedicated working hours.
It is expected that work resolves itself into full size installations on campus. It is important for us to evaluate the work at proper scale and to truly experience the work as a resolved object. Tools of documentation, drawing, sketching, and prototype building will be discussed as methods to work towards a final installed piece of work.
In order to install work on campus (and anywhere else, really) it is important to receive proper permissions from the facilities office in a written crit form. This will help ensure your work isn't disassembled or thrown out by the maintenance crew and that our campus isn't damaged. Please be respectful to our campus community and don't propose work that will damage or permanently alter structural elements of the campus in any way. This provides a unique set of challenges in the temporal nature of the work.
In accordance with RISD's attendance policy, students are required to be present and active in every class session. If a student is absent for two sessions the instructor has the right to fail that student for falling too far behind in the coursework
.Class runs from 1:10pm to 6:10pm on Friday afternoons in DC 601.
There will be two instances in which students will be expected to travel away from RISD's campus to do research. The first will be a visit to the ICA in Boston on each students' own time. The second will be a group trip to Dia:Beacon in Beacon New York. This trip will take place early on a Saturday, the class will leave Providence early in the morning and will return late in the evening. It is expected that everyone will be in attendance.
The critique serves as the central point of dialogue about the work we are all making. It is crucial for students to become invested in their critiques, not only in the evaluation and discussion of their own work, but in the work of others. This conversation and dialogue is an incredible opportunity to learn from a unique group of people. Please, do not waste this opportunity. Speak up in discussions, ask questions of your fellow students, ask questions of yourselves, ask questions of your instructor.
This course is predicated on those involved to be self motivated in their work. This must result in a robust making process that demonstrates students are looking for different ways to make work, to evaluate their work, and to make the work again. A robust process begins wide and narrows as ideas begin to clarify themselves. It is not enough to be inspired. Chuck Close once said "inspiration is for amateurs, the rest of us just get to work."
Craft and visual form in this class won't be evaluated in terms of cleanliness or austerity. Rather the discussion about craft will be revolve around the desire of the student to remain in control over the chosen production methods and for those production methods to align with the chosen method. Craft is what viewers notice and it is important for designers to take ownership of how the work is ultimately viewed and experienced.
As mentioned above. Students are required to show up to class, on time with work ready for presentation.


Prototype Sample
We are going to print the "NAME" using the arrow function Print. Please, see the console.


Set of reusable cards templates built with angular material deisgn
Scroll down to see it in action!
Code on Github Documentation


| Function name | Function info |
|---|---|
adj(1) : adj(x), where x is 2D square matrix, returns the adjugate matrix of x. |
|
alloc_array(1...) : alloc_array(x...) returns a newly allocated array whose size is determined by parameters. All the parameters must be positive integers. alloc_array(2) : alloc_array(x, y) returns a newly allocated array whose size is determined by parameter x which is a list of integer. Parameter y is the default value of array elements. Note that y is optional, by default all the elements are initialized as zero. |
|
cofactor(1) : cofactor(x), where x is 2D square matrix, returns the cofactor matrix of x. |
|
det(1) : Function det(x) calculates determinant of square matrix x. |
|
deter(1) : Function deter(x) calculates determinant of square matrix x. |
|
dprod(2) : Function dprod calculates dot product of two vectors [x1, x2, ... xn] and [y1, y2, ... yn]. |
|
eig(1) : eig(A) calculates 2D square matrix A's eigen vectors and eigen values. This function returns a two element list. First element is the eigen vector matrix, each column is an eigen vector. Second element is a diagonal matrix. Each diagonal element is an eigen value. Note that this function needs big memory to run and consumes significant CPU time. If running in mobile device, size of A and B should be no greater than 6*6. If running on PC, A and B should be no greater than 8*8. Otherwise, it may fail because lack of memory or run for very long time. eig(2) : eig(A, B) calculates 2D square matrix A's eigen vectors and eigen values against same size matrix B, i.e. Av = lambda * Bv, where lambda is an eigen value and v is an eigen vector. The second parameter, B, is optional. By default, B is an I matrix. This function returns a two element list. First element is the eigen vector matrix, each column is an eigen vector. Second element is a diagonal matrix. Each diagonal element is an eigen value. Note that this function needs big memory to run and consumes significant CPU time. If running in mobile device, size of A and B should be no greater than 6*6. If running on PC, A and B should be no greater than 8*8. Otherwise, it may fail because lack of memory or run for very long time. |
|
eye(1) : eye(x), where x is a positive integer, returns 2-D matrix I whose size is x times x. Note that eye(0) returns 1. eye(2) : eye(x,y), where x and y are both positive integer numbers, returns y-D matrix I whose size of each dimension is x. |
|
get_eigen_values(1) : get_eigen_values(A) calculates 2D square matrix A's eigen values. This function returns an eigen value list which includes all the eigen values including duplicated ones. Note that this function needs big memory to run and consumes significant CPU time. If running in mobile device, size of A and B should be no greater than 6*6. If running on PC, A and B should be no greater than 8*8. Otherwise, it may fail because lack of memory or run for very long time. get_eigen_values(2) : get_eigen_values(A, B) calculates 2D square matrix A's eigen values against same size matrix B, i.e. Av = lambda * Bv, where lambda is an eigen value and v is an eigen vector. The second parameter, B, is optional. By default, B is an I matrix. This function returns an eigen value list which includes all the eigen values including duplicated ones. Note that this function needs big memory to run and consumes significant CPU time. If running in mobile device, size of A and B should be no greater than 6*6. If running on PC, A and B should be no greater than 8*8. Otherwise, it may fail because lack of memory or run for very long time. |
|
get_extreme_elem(3) : Function get_extreme_elem analyses input dataArray and returns the maximum or minimum element in the data array. If an element is not a real value, this function ignores it. It has three parameters. The first is data array (it can be a single value), the second is original max or min value. If this is not null and is a real value, the function compares selected max or min element with this parameter and returns the new max or min value. The third one is to tell the function to get max value or min value. 0 is for min value and 1 is for max value. Examples are get_extreme_elem([[2, 3], "hello", 5], null, 1) and get_extreme_elem([[3,4,6],[5+3i, 7, 9.88-4.61], [5.77 -0.03i]], -8, 0). |
|
includes_inf(1) : includes_inf(x) determines if x includes positive infinite or negative infinite. Include means, if x is an array, then one of its elements is or includes the destination value(s), if x is a complex value, then its real or image is the destination value(s), if x is a single value, then it is the destination values(s). If it is, return true. Otherwise, return false. |
|
includes_nan(1) : includes_nan(x) determines if x includes Nan. Include means, if x is an array, then one of its elements is or includes the destination value(s), if x is a complex value, then its real or image is the destination value(s), if x is a single value, then it is the destination values(s). If it is, return true. Otherwise, return false. |
|
includes_nan_or_inf(1) : includes_nan_or_inf(x) determines if x includes Nan or positive infinite or negative infinite. Include means, if x is an array, then one of its elements is or includes the destination value(s), if x is a complex value, then its real or image is the destination value(s), if x is a single value, then it is the destination values(s). If it is, return true. Otherwise, return false. |
|
includes_nan_or_inf_or_null(1) : includes_nan_or_inf_or_null(x) determines if x includes Nan or positive infinite or negative infinite or null. Include means, if x is an array, then one of its elements is or includes the destination value(s), if x is a complex value, then its real or image is the destination value(s), if x is a single value, then it is the destination values(s). If it is, return true. Otherwise, return false. |
|
includes_null(1) : includes_null(x) determines if x includes null. Include means, if x is an array, then one of its elements is or includes the destination value(s), if x is a complex value, then its real or image is the destination value(s), if x is a single value, then it is the destination values(s). If it is, return true. Otherwise, return false. |
|
invert(1) : invert(x) inverted 2D matrix x. Note that the elements of x can be complex numbers but x must be a square matrix (i.e. number of rows equals number of columns). |
|
is_eye(2) : is_eye(x,y), where x is an array or number and y is a boolean, identifies x is matrix I (or 1) or not. If x is matrix I (or 1), returns true, otherwise, returns false. If y is true, looks on all null values as zero, otherwise, null values are not looked on as zero. Y is optional. By default, it is false. |
|
is_zeros(2) : is_zeros(x,y), where x is an array or number and y is a boolean, identifies x is matrix zeor (or number zero) or not. If x is, returns true, otherwise, returns false. If y is true, looks on all null values as zero, otherwise, null values are not looked on as zero. Y is optional. By default, it is false. |
|
left_recip(1) : left_recip(x) calculates left-division reciprocal of x. Note that so far x can only be a number or a 2D matrix. |
|
ones(1...) : Function ones generates a matrix whose elements are all one. The dimension of the matrix is determined by the parameters of ones function, which is either a number of positive integers or a single positive integer list. Note that ones([]) returns 1. |
|
rank(1) : rank(matrix) returns the rank of a matrix. For example rank([[1,2],[2,4]]) returns 1. |
|
recip(1) : recip(x) calculates reciprocal of x. Note that so far x can only be a number or a 2D matrix. |
|
set_array_elem(3) : set_array_elem(x,y,z) sets x[y] to be z, and returns new x. Note that x can be an array or a single element, y must be a list of positive integers which are the indices. Y can be beyond the size of x. For example x = 3, y = [1, 2], z = 2 + 3i then set_array_elem(x,y,z) = [3, [0, 0, 2+3i]]. |
|
size(1) : size(x) returns a size list of array x. Note that if x is not an array, it always return []. size(2) : size(x,y) returns a size list of array x which includes the first y dimension sizes. If x has less than y dimensions, return full size list. Note that y must be a positive integer. Note that if x is not an array, it always return []. |
|
zeros(1...) : Function zeros generates a matrix whose elements are all zero. The dimension of the matrix is determined by the parameters of zeros function, which is either a number of positive integers or a single positive integer list. Note that zeros([]) returns 0. |


Week 8 Technical Blog
BootCoder
What is Rails?
Rails is a web development framework for the ruby programming language.
Rails relies on the Model-View-Controller design pattern.
Model
The model is the part of your application that is responsible for storing and retrieving objects from a database. This model is the logic behind how your app works, the gears behind the curtain so to speak.
View
The view is the part of the app which controls the content that is actually displayed to the end user. These could be static pages or dynamically generated pages using interactive ruby.
Controller
The controller straddles the void between the Model and the View. Basicly the controller fetches information from the database based on the parameters provided by the model, then it passes said information to the view to be displayed to the end user.


Your request to retrieve your password has been received correctly.You will shortly receive an email with instructions to follow in order to complete the process.