Welcome to the Internet Sites of the American Chemistry Council® ("ACC"), which represents the leading companies engaged in the business of chemistry, including significant business groups such as the Plastics Division and the Chlorine Chemistry Division. The American Chemistry Council, its subsidiaries, and affiliated companies (referred to herein as "Council," "we," "us," or "our") maintain these sites (each a "Council Site" and collectively "Council Sites").
BY USING A COUNCIL SITE, YOU SIGNIFY YOUR AGREEMENT TO ALL TERMS, CONDITIONS, AND NOTICES CONTAINED OR REFERENCED IN THESE TERMS & CONDITIONS (THE "TERMS & CONDITIONS" OR "TERMS") ON OUR SITES. IF YOU DO NOT AGREE TO THESE TERMS & CONDITIONS YOU ARE NOT AUTHORIZED TO USE COUNCIL SITES. WE RESERVE THE RIGHT, AT OUR DISCRETION, TO CHANGE, MODIFY, ADD TO, OR REMOVE PORTIONS OF THESE TERMS AT ANY TIME WITHOUT NOTICE. PLEASE CHECK THE TERMS PERIODICALLY FOR CHANGES. YOUR CONTINUED USE OF COUNCIL SITES FOLLOWING THE POSTING OF ANY CHANGES TO THESE TERMS CONSTITUTES ACCEPTANCE OF THOSE CHANGES.
Some Council Sites or areas of Sites may have different terms and conditions posted. Any such terms will not vary or replace these Terms & Conditions regarding the use of Council Sites, unless they expressly state otherwise. Additionally, a Council Site may contain page(s) or areas with their own Terms & Conditions, in addition to those listed here, which you should review and with which you must agree in order to use those areas.
Council Sites and their contents are protected pursuant to U.S. and international copyright laws. All materials published on Council Sites are the copyrighted property of the Council, its subsidiaries, and affiliated companies, third party licensors, or the party credited. The Council claims no copyright in any government or other public domain content that may be on our sites. All trademarks, service marks, certification marks and trade names, including but not limited to the ACC mark, Responsible Care®, the hands logo mark, Responsible Care Management System®, RCMS®, RC14001®, americanchemistry.com®, CHEMTREC®, TRANSCAER® and ChemITC® are owned by the Council and are protected by state, federal, and international trademark law. All other trademarks appearing on Council Sites are the property of their respective owners.
Except where otherwise noted, permission to use Materials (such as white papers, press releases, datasheets, and FAQs) from Council Sites is granted, provided that (1) none of the copyright, trademark, or other proprietary notices are removed, (2) the Materials are not edited or modified in any way without prior written consent, (3) use of such Materials from the Council Site is for informational and non-commercial or personal use only and may not be used in a misleading or deceptive manner, and (4) you do not use any Materials, without express written permission, in a manner that suggests an association with any of our business units, services, initiatives or other activities. Further, you agree to abide by all additional copyright notices, information, or restrictions contained in any material or content on the Council Sites.
Materials specified above do not include the design or layout of the Council Sites or any other Council owned, operated, licensed, or controlled site.
You may not frame or alter the appearance of Council Sites.
You may not state or imply that the Council endorses, sponsors or otherwise approves your site or any other sites.
You may not use any Council Trademarks, service marks or logos without prior written consent.
In view of the dynamic nature of the Internet, and the possibility of updates and changes, we request that your link enter Council Sites at their home pages.
You must abide by all of the other Council Terms and Conditions of use set forth herein.
Due to the diverse nature of our web activities, websites within the Council Internet family may have linking policies that differ from this policy. In such cases, the linking policy of the particular Council Site will be posted, and will supersede the Terms regarding linking to Council Sites of this document.
If you download software or applications from any Council Site, the software or applications, including any files, images incorporated in or generated by the software or applications, and data and instructions accompanying the software or applications (collectively, the "Software") are licensed to you by the Council or our third party licensors for your personal, non-commercial use. We do not transfer title to the Software to you. We (or third-party licensors) retain full and complete title to the Software and all intellectual property rights therein. Except as expressly authorized by us, you agree not to redistribute, sell, de-compile, reverse engineer, disassemble, or create derivative works based on the Software, in whole or in part.
If you have any questions regarding this notice, please complete and submit your questions to us.
Council Sites may include forums, chat rooms, e-mail function, or other areas (collectively "Forums"), where users can post or exchange information, ideas, opinions, photographs, images, videos, creative works or any other materials (collectively "Messages") with other users of the Site or the Internet. In no event shall the Council assume or have any responsibility or liability for any Messages posted on Forums or for any claims, damages or losses resulting from their use or appearance on a Council Site. Children under the age of 18 are not authorized to post messages or participate in Forums on Council Sites.
The Council does not control Messages delivered to Forums, and the Council has no obligation to monitor such Forums. If at any time the Council chooses, in its sole discretion, to monitor the Forums, the Council nonetheless assumes no responsibility for the content of the Messages, no obligation to modify or remove any inappropriate Messages, and no responsibility for the conduct of the user submitting any Messages.
The Messages do not necessarily reflect the views of the Council and are not necessarily reviewed prior to posting. The Council makes no warranties, express or implied, as to the content of the Messages in the Forums or the accuracy or reliability of any Messages and other materials in the Forums. The Council reserves the right at all times to disclose any information (including the identity of the persons providing information or materials on its Forums) as necessary to satisfy any law, regulation, or governmental request. Further, the Council reserves the right to restrict, prohibit your use, and remove or edit Messages from any Forum at any time, for any reason.
By posting Messages (including but not limited to acts of uploading files, inputting data, or engaging in any other form of communication) through Forums, you are granting the Council a royalty-free, perpetual, non-exclusive, unrestricted, worldwide license to use, reproduce, modify, adapt, publish, translate, publicly perform and display, create derivative works from and distribute such materials and/or ideas or incorporate such materials and/or ideas into any form, medium, or technology now known or later developed throughout the universe, and that all so-called "moral rights" to such Messages have been waived. This grant of rights means that such Messages will be owned by the Council, and may be used without any payment to, or further authorization by you. The foregoing grants shall include the right to exploit any proprietary rights in such communication, including but not limited to rights under copyright, trademark, service mark, or patent laws under any relevant jurisdiction.
Interfere with another user's use and enjoyment of a Council Site or any other individual's use and enjoyment of related services.
If at any time you are not happy with the Forums or object to any material within Forums, your sole remedy is to cease using them.
Council Sites may contain certain activities including, without limitation, e-mail services, contests, sweepstakes, and auctions (collectively "Contests"). Each Contest has its own rules, which you must read and agree to before you may enter.
At certain places on Council Sites, users may be able to link to other Internet addresses. These other sites are not under the control of the Council, and you acknowledge that the Council is not responsible for the accuracy, copyright compliance, legality, decency, or any other aspect of such sites. The inclusion of such a link does not imply endorsement of the site by the Council or any association with its operators. Use of any information on Council Sites or obtained from linked addresses is voluntary and reliance on it should only be undertaken after an independent review. A link or reference herein to any specific commercial product, process or service by trademark name, trademark, service mark, manufacturer or otherwise does not constitute or imply endorsement, recommendation or favoring by the Council.
User access and use of Council Sites, or portions thereof may be restricted through the use of a login and password registration mechanism or similar process (collectively "User Account"). You are responsible for maintaining the confidentiality of your User Account, and are fully responsible for all activities that occur under your User Account. You agree to (a) immediately notify us of any unauthorized use of your User Account or any other breach of security, and (b) ensure that you exit from restricted areas at the end of each session. We will not be liable for any loss or damage arising from your failure to comply with this provision.
We may change, suspend or discontinue any aspect of our online services at any time, including the availability of any feature, database, or content available at a Council Site. The Council may also impose limits on certain features and services or restrict your access to parts or all of a Council Site(s) without notice or liability.
We may give notice to our users by means of a general notice on any Council Site, electronic mail to a user's e-mail address in our records, or by written communication sent by first-class mail to a user's address in our records.
The Council respects the rights of all copyright holders and we ask our users to do the same. If you believe that your work has been copied in a way that constitutes copyright infringement on a Council Site, or your intellectual property rights have been otherwise violated, please provide the Council's Copyright Agent with the information required by the Online Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act, 17 U.S.C. § 512.
This contact information is for notices of copyright infringement only.
Through this provision the Council seeks to preserve any and all exemptions from liability that may be available under the copyright law, but does not necessarily stipulate that it is a service provider as defined in 17 U.S.C. § 512 or elsewhere in the law.
Nothing contained on Council Sites is intended as, nor shall be construed as, legal advice, guidance, or interpretation. No attorney-client relationship is established between the Council and you by your using Council Sites. The information provided on Council Sites is for general informational purposes only, and questions about any law, statute, or regulation should be directed to an attorney with expertise in the relevant area.
COUNCIL SITES AND ALL MATERIALS, INFORMATION, SOFTWARE, PRODUCTS, AND SERVICES INCLUDED IN OR AVAILABLE THROUGH COUNCIL SITES (THE "CONTENT") ARE PROVIDED "AS IS" AND "AS AVAILABLE" FOR YOUR USE. COUNCIL SITES INCLUDING CONTENT ARE PROVIDED WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT. THE AMERICAN CHEMISTRY COUNCIL, ITS MEMBERS, SUBSIDIARIES, AFFILIATED COMPANIES, ITS LICENSORS, EMPLOYEES, AND THE LIKE, DO NOT WARRANT THAT COUNCIL SITES AND CONTENT ARE ACCURATE, COMPLETE, RELIABLE, CORRECT, OR FREE FROM ERROR OR OMISSIONS; THAT COUNCIL SITES WILL BE AVAILABLE AT ANY PARTICULAR TIME OR LOCATION; THAT ANY DEFECTS OR ERRORS WILL BE CORRECTED; OR THAT COUNCIL SITES AND CONTENT ARE FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS. FURTHERMORE, THE COUNCIL, AND ON BEHALF ITS MEMBERS, SUBSIDIARIES, AFFILIATED COMPANIES, ITS LICENSORS, EMPLOYEES, AND THE LIKE, HEREBY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF TITLE AND/OR NON-INFRINGEMENT RELATED TO COUNCIL SITES. YOUR USE OF COUNCIL SITES IS SOLELY AT YOUR OWN RISK.
UNDER NO CIRCUMSTANCES SHALL THE AMERICAN CHEMISTRY COUNCIL, ITS MEMBERS, SUBSIDIARIES, AND AFFILIATED COMPANIES, ITS LICENSORS, EMPLOYEES, AND THE LIKE, BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES RELATED TO YOUR VIOLATION OF THESE TERMS OR THAT RESULT FROM THE USE OF, OR INABILITY TO USE, COUNCIL SITES. THIS LIMITATION APPLIES WHETHER THE ALLEGED LIABILITY IS BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY, OR ANY OTHER BASIS, EVEN IF THE COUNCIL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. BECAUSE SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, THE COUNCIL'S LIABILITY IN SUCH JURISDICTIONS SHALL BE LIMITED BUT ONLY TO THE EXTENT PERMITTED BY LAW.
You agree to indemnify and hold harmless and upon request defend, the American Chemistry Council, its members, subsidiaries, and affiliated companies, its licensors, employees, and the like, from all liabilities, claims, and expenses, including attorney's fees, that arise from your use or misuse of Council Sites and/or breach of these Terms. The Council reserves the right, at it own expense, to assume the exclusive defense and control of any matter otherwise subject to indemnification by you, in which event you will cooperate with the Council in asserting any available defenses.
The Council Sites are maintained by or on behalf of the Council, located in the District of Columbia, United States of America, or its affiliates. We make no representation that these materials are appropriate or available for use in any particular location. If you use a Council Site, you are responsible for compliance with applicable laws. By downloading or using content or features of a Council Site, you assume the responsibility for doing so in compliance with the law that applies in jurisdiction(s) where you are located.
The Council makes no representation that materials on Council Sites are appropriate or available for use in locations outside the United States, and accessing them from territories where their contents are illegal is prohibited. Those who choose to access Council Sites from other locations do so on their own initiative and are responsible for compliance with local laws.
Software available through Council Sites is subject to U.S. export controls. No software available from a Council Site may be downloaded or otherwise exported or re-exported (i) into (or to a national or resident of) any country to which the U.S. now or in the future embargoes goods; or (ii) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals, the U.S. Commerce Department's Table of Denial Orders, or anyone subject to any other U.S. export restrictions. By downloading or using any software available on a Council Site or from a link to a Council Site, you agree to the foregoing and you warrant that you are not located in, under the control of, or a national or resident of any such country on any such list, or otherwise in violation of U.S. export restrictions.
This Agreement shall be governed by and construed in accordance with the laws of the Commonwealth of Virginia, United States of America. Actions brought under this Agreement shall be brought in the Commonwealth of Virginia in: (1) the Arlington Circuit Court (17th Circuit); (2) the Alexandria Circuit Court (18th Circuit); or (3) in the United States District Court for the Eastern District of Virginia in Alexandria, provided that federal jurisdictional requirements are satisfied. You agree and submit to the jurisdiction of such courts for the purpose of litigating any claim or action related to this Agreement.
Unless otherwise specified herein or expressly stated at Council Sites, the terms of this agreement constitute the entire agreement between you and the Council with respect to Council Sites and supersede all prior or contemporaneous communications and proposals (whether oral, written, or electronic) between you and the Council with respect to Council Sites. If any part of these Terms & Conditions or terms specific to a Council Site is held invalid or unenforceable the remaining portions shall remain in full force and effect.
The Council reserves the right, in its sole discretion, to terminate your access to all Council Sites, a specific Council Site, or an area of a Council Site immediately and without notice. If you have any problems with these Terms & Conditions or with a Council Site your sole and exclusive remedy is to cease using the website(s).
Site(s), these Terms & Conditions shall survive.
These Terms & Conditions were last updated on January 10, 2013.
© 2005-2016 American Chemistry Council, Inc.


A big congratulations to client Choice Energy for its inclusion on the Inc. 5000 list of fastest growing company debuting at No. 40 on the list and No. 1 for Iowa companies! The company has experienced incredible growth for their operations posting a 6,021% growth over a 3-year period. The company supplies electricity to residential and commercial customers, and is currently licensed to conduct business in Connecticut, Ohio, New Jersey, Pennsylvania, Illinois, Massachusetts, and Maine.
You can check out the company's profile on the Inc. 500 list here.


Whether on a short business trip or a longer assignment, there are steps you can take to reduce the risks you may face.
Why do I need cyber insurance? A team of recovery experts at your fingertips to sort things after an attack.
As a trustee you have a duty of care. Yet underinsurance is a problem faced by many charities. Our specialist brokers can help.
We've simplified the way earthquake claims are managed. Our specialist insurance brokers know how to provide the help you need when you really need it.
Major events carry substantial risks for cancellation or postponement due to weather, and issues like construction delays.
Go into the draw to win $1,000 worth of Dunstan product!
Crombie Lockwood's claims team set the standard for earthquake claims management and resolution after Christchurch's devastating earthquake on 22 February 2011.
What do soft and hard markets mean for you in terms of insurance cover, benefits and cost of insurance premiums?
Under-estimating total sums insured insurance could leave you underinsured and open to another disaster.
Takapuna insurance team are now in an eye-catching building at 15 Huron Street on Auckland's North Shore.
Business interruption insurance carries a sum insured & maximum indemnity period. Don't be limited by your BI.
What do soft & hard markets mean for you in terms of insurance cover, benefits & cost of insurance premiums?
Insurance for natural disasters, insurance excess, natural disaster cover, insurance claim, making an insurance claim.
New Zealand is ranked as the 2nd riskiest country in the world when it comes to natural disasters, but we're the 4th best protected.
Is your business CyberSAFE? 25% of New Zealand businesses have had a cyber attack in the past 12 months. Everyone's a cyber target.
Commercial vehicles are constantly on the go. We deliver fleet insurance while keeping rising premiums under control.
Working as an insurance broker you make personal and professional contributions to the communities you serve.
Is your business CyberSAFE? New Zealanders are told to be cautious after Netsafe reported an increase in the number of fake invoice scams.
You've heard of phishing but what is whaling?
Good cyber risk management from Crombie Lockwood can cover you when you've been caught by phishing, whaling and scammer emails.


text:
Q: Using eval to execute functions There is something I don't understand about how eval works.
Suppose I have a function foo:
function foo() {
    console.log("test");
}

And then I write
eval("foo()");

or
eval("foo" + "();");

The function foo is executed and I have "test" printed out.
However, if I write:
eval("function foo() { console.log(\"foo\"); }();");

or
eval("function foo() { console.log(\"foo\"); }" + "();");

I get "SyntaxError: Unexpected token )".
Why is that? I saw that when I pass the function name it is evaluated into the function's code, so I though it's supposed to be the same as "eval("foo" + "();");"
I'm using Chrome 27 if it makes any difference.

A: Because no answer is specific about why the last snippet fails, and nobody seems to be warning you for the dangers of eval:
eval, according to MDN:

A string representing a JavaScript expression, statement, or sequence of statements. The expression can include variables and properties of existing objects.

Your string, "function foo(){console.log('foo');}()" actually consists of 2 statements, that make no sense to the JS engine. Well, the second one doesn't:
function foo(){console.log('foo');}//function declaration, fine
;//<-- js adds implied statement terminator
()//no invocation, because no function reference, group nothing ==> does not compute, raise error

That's why you have to turn your function declaration statement into an expression, by adding an operator. Typically, this is the grouping operator: ()
(function foo(){ console.log('foo')});

The function declaration is now an expression, everything (the grouping () included) can be seen as a statement, unless the code that follows belongs to the code above. In this case, the invoking parentheses clearly do, so the JS engine sorts it out for you.
For clarity, some say the preferred notation is:
(function f(){}());//<-- invoking parentheses inside group

Which makes sense, because the invocation is part of the statement, after all.
If you don't like all these parentheses, any operator will do:
~function(){}();//bitwise not
+function(){}();//coerce to number

Are all equally valid. Note that they will change the possible return values of the function expression.
(function(){}());//resolves to undefined
+function(){}();//resolves to NaN, because undefined is NotANumber

How your eval could look, then, is any of the following:
eval("(function (){console.log('foo');}());");
eval("~function (){console.log('foo');}();");
eval("!function (){console.log('foo');}();");

And so on, and so forth...
Lastly, eval evaluates code in the global scope, so any code eval-ed containing functions can, and likely will, polute the global namespace. Mallicious code will also have access to everything, so be weary of XSS attacks and all other JS based techniques.
Bottom line, eval is evil, especially since all browsers now support JSON.parse natively, and for those that don't, there still is a tried and tested JSON2.js file out there.
Using eval in strict mode does make things slightly safer, but doesn't prevent XSS attacks at all, the code can still manipulate the DOM, for example, and reassign exposed DOM references or objects.
Google "why eval is evil" if you want to find out more.
Also check the ECMAScript specs

A: eval("(function() { console.log(\"foo\"); })()");

This is called a self-executing anonymous function.

A: function x() {} is a statement, whereas everything else you're doing is an expression, and you can only evaluate expressions.
The other answers explain how you can turn this statement into an expression. Thought I'd let you know why you actually get an error, though. :)

A: you would need to call
eval("function foo() { console.log(\"foo\"); };" + " foo();");

in order for this to work;

A: Put brackets around your function
eval("(function foo() { console.log(\"foo\"); })()");

It is like calling
(function foo() { console.log("foo"); })()

A: The main thing you should understand about eval is that it is evil.  Don't use it... ever.  There is always a way to achieve the same thing by dynamically creating a script document or by using a closure.
Read Douglas Crockford: JavaScript the good parts.

redpajama_set_name: RedPajamaStackExchange


text:
Q: How to replace union by join in mysql select service_type from service_type as s union select service_type
from cust_service_type as cs

I want to replace UNION by JOINS. Please let me know the changes that will need to be made.

A: MySQL does not support FULL JOIN so it's impossible to do this in MySQL.
In other systems, you could use this syntax:
SELECT  DISTINCT COALESCE(service_type, cust_service_type)
FROM    service_type s
FULL JOIN
        cust_service_type cs
ON      cs.service_type = s.service_type

or
SELECT  DISTINCT service_type
FROM    service_type s
FULL JOIN
        cust_service_type cs
USING   (service_type)

for systems that support JOIN ... USING
Note that UNION is much more efficient than this solution.
Update:
If you want all fields from both tables, use this:
SELECT  *
FROM    service_type s
UNION ALL
SELECT  *
FROM    cust_service_type cs
WHERE   service_type NOT IN
        (
        SELECT  service_type
        FROM    service_type
        )


You could make a case that the personal blog has impacted academic librarianship in several noticeable ways. First, changing the dynamic of how new ideas are proposed, and how new resources are shared. Second, shifting how academic librarians communicate ideas and engage in discourse. And third, and perhaps most significantly, influencing thought and establishing new trends in academic librarianship. Arguably, blogs appear to have eclipsed what was once the domain of the published journal article. While I still believe in the viability of the published article as a communication vehicle and as a demonstration of one's ability to succeed in the venue of traditional disciplinary publishing, for many academic librarians – particularly those new to the profession – that may no longer be the case. And if blogs were ever to replace scholarly journal articles as the gold standard for those on the tenure track, published journal articles would likely languish even more.
But this post isn't a discussion of the blog's impact on publishing. It raises the question of the blog's impact on another professional communication mode that seems to be on the decline – the personal web site. In the pre-blog days if an academic librarian wanted to achieve some of those things for which a blog now serves, a personal web site was the best available option. It could provide a personal profile, access to a CV, a listing of articles and presentations, resources that the site owner wanted to share with colleagues, and specialized resource pages designed to enlighten colleagues, promote new ideas, and create a name for oneself. Perhaps the blog's ability to accomplish the latter is the primary reason why the personal web site is no longer the first choice – or a choice at all – for many academic librarians who want to establish themselves as thought leaders in the profession and influence their colleagues.
Why am I thinking about personal web sites? One of my summer projects, not yet fully completed, was to move my personal web site to a new domain and to give it a redesign. I've been gradually moving the content from my previous employer's server to a new location – my own domain. As the task nears completion it got me wondering whether the site and its content would still hold the same professional value as when I began a personal web site in 1998 or whether it would just be perceived as an anachronism. In the earlier days of the Internet having one's own site was all the rage. I don't believe the current choice is web site versus blog. I think it makes sense to have both. A blog is a superior way to share news and ideas with immediacy. Although it may be in decline, a personal web site can still offer some advantages. It provides a place for more in depth information. A librarian with a web site can establish his or her expertise in a subject discipline with a resource list or provide more detailed information about his or herself.
What I would call a "staff page" – a page in your library web site that identifies you but really isn't a developed site, doesn't really count as having a personal web site. To my way of thinking a personal web site is more robust – it at least has more than one page and a diverse range of information and resources. Staff pages are pretty common, and most are pretty thin on content.
Note to my fellow academic bloggers: the results are based on quick internet searches and blog visits; if the information is not correct or you don't agree with my assessment – chime in.
I also checked out a number of A-List bloggers to see how many of them maintain a web site in addition to their blog. Turns out that not too many of them do. Seems the trend is to blend some traditional web site content (CV, articles, presentations) into the blog site, usually in the "about" section.
So what can we learn from this? The sample of prominent (legacy) academic librarians I chose suggests that traditional web site content may be a bit more commonplace among that crowd, but certainly blogs are quite limited. While I found more of the blogging academic librarians less likely to have well-developed web sites, I found more web site-like content than I expected. But I think it's safe to say that for most newcomers to the profession a personal blog will win out over a personal web site. LIS students, especially those about to graduate, should give serious consideration to a personal web site that can function as a portfolio of academic accomplishments and demonstrate web design skills. For the new grad, a web site may be of greater value than a blog.
A web site, in my experience, is more time consuming initially to design and implement, but once established it requires just occasional updating. I think there are some good skills to be learned from this process – FTP, file structures, web site architecture and design, absolute vs. relative linking, bookmark linking, etc. Re-designing my personal web site gave me an opportunity to get more Dreamweaver experience, to figure out how to get a flash file to load on a web page, and to experiment with new design features. Is the personal web site passe? For academic librarians that appears to be the trend. But I don't doubt that its decline has something to do with the recognition factor and where a librarian gets more bang for the buck. In that department, these days, a blog has the web site beat by a mile.
Check here, http://www.jimrettig.org/ It's a fairly new website.
I have a blog and a "personal page" at karin.dalziel.org – though I regard the personal page as my C.V. – and it runs on blog software.
While learning HTML is a good skill to have (this is coming from someone who once coded thousands of pages in a text editor), I think the days of hand coded web pages are ending rapidly. Programs like Drupal and WordPress let you make websites- not just blogs. Many can be installed with one click by your web host. You can install templates and alter them to make them your own. And- best of all- you can update them with ease.
Thanks for the mention, though I wonder why you didn't actually link to the blogs you name.
Why? Because a reasonable number people seem to be interested in what I write on the blog. Some people might be interested in past presentations or publications, but they can find those linked on the blog. I can't think of anyone who would be interested in my CV or resume.
So I think you are right about bang for the buck. Build up a blog by writing interesting stuff with some frequency and you find yourself making new friends and professional contacts and carrying on provocative conversations with people from all over the world. Build up a personal site, and I don't quite know what you get.
Thanks for mentioning me in your article. I found it to be a very good analysis. I did have a personal page at my former employer and also one at my own domain name for several years. I started the one at billdrew.pbwiki.com because I wanted to learn PBwiki and I also wanted one that would be very easy to update. It proved especially valuable in the interview process for my new job here at TC3. Many of the people on the interview committee visited the site as did the academic dean who we all report to and the college president. I know the president visited it because he mentioned it to me.
I do not update the wiki frequently but the content is up to date. I use my blog for my postings when I have time.
Steven. Great post. I made the same observation when I posted on Twitter last month. It so happens I have a personal web page, but I find it rather embarrassing since it still has the mid-1990's look of when it was created. Maybe this is my call to action?
I think this is fairly characteristic of Web 1.0 rhetoric – self-representation that is relatively formal, controlled, and intended to provide a limited amount of basic information framed for a particular audience. My Heckle and Jyde identities, oddly enough, mingle more comfortably at Facebook and in my personal blog where I don't try to separate them – whether that's because I've changed or technology has, I'm not sure.
I suspect there's a new and complex rhetoric developing for the self-fashioning involved in Web 2.0 technology that is significantly different than the kind of identity projected when a web page was the primary means of telling the world who you were. It almost seems now we are what we're interested in and talking about – not who we declare ourselves to be – and that's what shows in our social networks.
Why didn't I link to the blogs I named? I guess I'm either lazy or I'm trying to save a little time by skipping something readers could figure out for themselves. It's probably the former and not the latter.
Barbara raises an interesting point I didn't considere. Is the personal web site too 1.0 for today's web world. Admittedly my web site is strictly a read-only site – there's no write-to-it option. But is that a turn off for folks? I still think there's a good deal of value at the Keeping Up web site – even if you can't add to it – but there sure is a lot you can take away from it. But just the same the old-style web site just doesn't allow for much peer production.
I did once have a personal site (1998-2005) …. http://web.archive.org/web/20050405204255/alexia.lis.uiuc.edu/~janicke/lisa.htm … but the server was retired and I – like many others I suspect – didn't so much make a decision not to have a personal site but rather regularly run out of time in my weeks to do everything that might be good to do. It's on the list. But, the list is long.
Barbara, you raise a compelling point about co-mingled identities in Facebook and perhaps then throughout the 2.0 world. Your (1.0?) approach of separation isn't unique among mid-career librarians I know. It is more difficult now than ever before to maintain separate identities in multiple professional venues (such as your library and fiction writing careers) and also in personal expression as well, isn't it? What do we gain from it? Do we lose anything if we give it up?
There was a thread on a discussion list recently about whether or not the discussion list, itself, had lost much of its utility as a useful technology (very "meta"), and I see shades of that argument in this discussion. What is the personal Web page for – personal history, CV; dissemination of information; enhancing the ability of others to discover your ideas (chiefly through links to your other Web resources, citations to your print work, or links to content you've deposited in an OA repository)? Which of these goals is best suited for a 1.0 application like a Web page, and which are better addressed through a 2.0 application?
Certainly, blogging is not the only way to meet the goals that personal Web pages once served in terms of presenting one's ideas, and not even big-time bloggers like Michael Stephens have completely eschewed the traditional model of dissemination of ideas in print, but the landscape is far more complex than it was when I put my first library Web site together (on resources for the study of American education) in 1998!
Thanks for helping me to think about it!
Pingback: lauren's library blog » Blog Archive » goodbye homepage?
My blog has dedicated pages that list my articles and presentations. I periodically blog about resources for others. The only thing I don't have on there is a CV. That's mainly due to the fact that I believe in tailoring such things for any given context. Maybe some blogs have a hybrid quality (i.e. elements of the personal website and blog) to them?
Next Next post: Who Are We and Where Are We Going?


text:
/* jshint node:true, sub:true, indent:4  */
/* global describe, beforeEach, afterEach, it, spyOn, expect */

var configChanges = require('../../src/plugman/util/config-changes'),
    xml_helpers = require('../../src/util/xml-helpers'),
    ios_parser = require('../../src/plugman/platforms/ios'),
    fs      = require('fs'),
    os      = require('osenv'),
    et      = require('elementtree'),
    path    = require('path'),
    shell   = require('shelljs'),
    xcode = require('xcode'),
    temp    = path.join(os.tmpdir(), 'plugman'),
    dummyplugin = path.join(__dirname, '..', 'plugins', 'org.test.plugins.dummyplugin'),
    cbplugin = path.join(__dirname, '..', 'plugins', 'org.test.plugins.childbrowser'),
    childrenplugin = path.join(__dirname, '..', 'plugins', 'org.test.multiple-children'),
    shareddepsplugin = path.join(__dirname, '..', 'plugins', 'org.test.shareddeps'),
    configplugin = path.join(__dirname, '..', 'plugins', 'org.test.configtest'),
    varplugin = path.join(__dirname, '..', 'plugins', 'com.adobe.vars'),
    plistplugin = path.join(__dirname, '..', 'plugins', 'org.apache.plist'),
    android_two_project = path.join(__dirname, '..', 'projects', 'android_two', '*'),
    android_two_no_perms_project = path.join(__dirname, '..', 'projects', 'android_two_no_perms', '*'),
    ios_config_xml = path.join(__dirname, '..', 'projects', 'ios-config-xml', '*'),
    windows_testapp_jsproj = path.join(__dirname, '..', 'projects', 'windows8', 'TestApp.jsproj'),
    plugins_dir = path.join(temp, 'cordova', 'plugins');
var mungeutil = require('../../src/plugman/util/munge-util');
var PlatformJson = require('../../src/plugman/util/PlatformJson');
var PluginInfoProvider = require('../../src/PluginInfoProvider');
var PluginInfo = require('../../src/PluginInfo');

// TODO: dont do fs so much

var pluginInfoProvider = new PluginInfoProvider();

function innerXML(xmltext) {
    return xmltext.replace(/^<[\w\s\-=\/"\.]+>/, '').replace(/<\/[\w\s\-=\/"\.]+>$/,'');
}

function get_munge_change(munge, keys) {
    return mungeutil.deep_find.apply(null, arguments);
}

describe('config-changes module', function() {
    beforeEach(function() {
        shell.mkdir('-p', temp);
        shell.mkdir('-p', plugins_dir);
    });
    afterEach(function() {
        shell.rm('-rf', temp);
        ios_parser.purgeProjectFileCache(temp);
    });

    describe('queue methods', function() {
        describe('addInstalledPluginToPrepareQueue', function() {
            it('should append specified plugin to platform.json', function() {
                var platformJson = new PlatformJson(null, 'android', null);
                platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.dummyplugin', {});
                var json = platformJson.root;
                expect(json.prepare_queue.installed[0].plugin).toEqual('org.test.plugins.dummyplugin');
                expect(json.prepare_queue.installed[0].vars).toEqual({});
            });
            it('should append specified plugin with any variables to platform.json', function() {
                var platformJson = new PlatformJson(null, 'android', null);
                platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.dummyplugin', {'dude':'man'});
                var json = platformJson.root;
                expect(json.prepare_queue.installed[0].plugin).toEqual('org.test.plugins.dummyplugin');
                expect(json.prepare_queue.installed[0].vars).toEqual({'dude':'man'});
            });
        });

        describe('addUninstalledPluginToPrepareQueue', function() {
            it('should append specified plugin to platform.json', function() {
                var platformJson = new PlatformJson(null, 'android', null);
                platformJson.addUninstalledPluginToPrepareQueue('org.test.plugins.dummyplugin');
                var json = platformJson.root;
                expect(json.prepare_queue.uninstalled[0].plugin).toEqual('org.test.plugins.dummyplugin');
            });
        });
    });

    describe('load method', function() {
        it('should return an empty config json object if file doesn\'t exist', function() {
            var platformJson = PlatformJson.load(plugins_dir, 'android');
            expect(platformJson.root).toBeDefined();
            expect(platformJson.root.prepare_queue).toBeDefined();
            expect(platformJson.root.config_munge).toBeDefined();
            expect(platformJson.root.installed_plugins).toBeDefined();
        });
        it('should return the json file if it exists', function() {
            var filepath = path.join(plugins_dir, 'android.json');
            var json = {
                prepare_queue: {installed: [], uninstalled: []},
                config_munge: {files: {'some_file': {parents: {'some_parent': [{'xml': 'some_change', 'count': 1}]}}}},
                installed_plugins: {},
                dependent_plugins: {}};
            fs.writeFileSync(filepath, JSON.stringify(json), 'utf-8');
            var platformJson = PlatformJson.load(plugins_dir, 'android');
            expect(JSON.stringify(json)).toEqual(JSON.stringify(platformJson.root));
        });
    });

    describe('save method', function() {
        it('should write out specified json', function() {
            var filepath = path.join(plugins_dir, 'android.json');
            var platformJson = new PlatformJson(filepath, 'android', {foo:true});
            platformJson.save();
            expect(JSON.parse(fs.readFileSync(filepath, 'utf-8'))).toEqual(platformJson.root);
        });
    });

    describe('generate_plugin_config_munge method', function() {
        describe('for android projects', function() {
            beforeEach(function() {
                shell.cp('-rf', android_two_project, temp);
            });
            it('should return a flat config hierarchy for simple, one-off config changes', function() {
                var xml;
                var dummy_xml = new et.ElementTree(et.XML(fs.readFileSync(path.join(dummyplugin, 'plugin.xml'), 'utf-8')));
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(dummyplugin), {});
                expect(munge.files['AndroidManifest.xml']).toBeDefined();
                expect(munge.files['AndroidManifest.xml'].parents['/manifest/application']).toBeDefined();
                xml = (new et.ElementTree(dummy_xml.find('./platform[@name="android"]/config-file[@target="AndroidManifest.xml"]'))).write({xml_declaration:false});
                xml = innerXML(xml);
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest/application', xml).count).toEqual(1);
                expect(munge.files['res/xml/plugins.xml']).toBeDefined();
                expect(munge.files['res/xml/plugins.xml'].parents['/plugins']).toBeDefined();
                xml = (new et.ElementTree(dummy_xml.find('./platform[@name="android"]/config-file[@target="res/xml/plugins.xml"]'))).write({xml_declaration:false});
                xml = innerXML(xml);
                expect(get_munge_change(munge, 'res/xml/plugins.xml', '/plugins', xml).count).toEqual(1);
                expect(munge.files['res/xml/config.xml']).toBeDefined();
                expect(munge.files['res/xml/config.xml'].parents['/cordova/plugins']).toBeDefined();
                xml = (new et.ElementTree(dummy_xml.find('./platform[@name="android"]/config-file[@target="res/xml/config.xml"]'))).write({xml_declaration:false});
                xml = innerXML(xml);
                expect(get_munge_change(munge, 'res/xml/config.xml', '/cordova/plugins', xml).count).toEqual(1);
            });
            it('should split out multiple children of config-file elements into individual leaves', function() {
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(childrenplugin), {PACKAGE_NAME: 'com.alunny.childapp'});
                expect(munge.files['AndroidManifest.xml']).toBeDefined();
                expect(munge.files['AndroidManifest.xml'].parents['/manifest']).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.READ_PHONE_STATE" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.INTERNET" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.GET_ACCOUNTS" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="android.permission.WAKE_LOCK" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<permission android:name="com.alunny.childapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="com.alunny.childapp.permission.C2D_MESSAGE" />')).toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />')).toBeDefined();
            });
            it('should not use xml comments as config munge leaves', function() {
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(childrenplugin), {});
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<!--library-->')).not.toBeDefined();
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<!-- GCM connects to Google Services. -->')).not.toBeDefined();
            });
            it('should increment config hierarchy leaves if different config-file elements target the same file + selector + xml', function() {
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(configplugin), {});
                expect(get_munge_change(munge, 'res/xml/config.xml', '/widget', '<poop />').count).toEqual(2);
            });
            it('should take into account interpolation variables', function() {
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(childrenplugin), {PACKAGE_NAME:'ca.filmaj.plugins'});
                expect(get_munge_change(munge, 'AndroidManifest.xml', '/manifest', '<uses-permission android:name="ca.filmaj.plugins.permission.C2D_MESSAGE" />')).toBeDefined();
            });
            it('should create munges for platform-agnostic config.xml changes', function() {
                var munger = new configChanges.PlatformMunger('android', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(dummyplugin), {});
                expect(get_munge_change(munge, 'config.xml', '/*', '<access origin="build.phonegap.com" />')).toBeDefined();
                expect(get_munge_change(munge, 'config.xml', '/*', '<access origin="s3.amazonaws.com" />')).toBeDefined();
            });
        });

        describe('for ios projects', function() {
            beforeEach(function() {
                shell.cp('-rf', ios_config_xml, temp);
            });
            it('should special case framework elements for ios', function() {
                var munger = new configChanges.PlatformMunger('ios', temp, 'unused', null, pluginInfoProvider);
                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(cbplugin), {});
                expect(munge.files['framework']).toBeDefined();
                expect(get_munge_change(munge, 'framework', 'libsqlite3.dylib', false)).toBeDefined();
                expect(get_munge_change(munge, 'framework', 'social.framework', true)).toBeDefined();
                expect(get_munge_change(munge, 'framework', 'music.framework', false)).toBeDefined();
                expect(munge.files['framework'].parents['Custom.framework']).not.toBeDefined();
            });
        });
        describe('for windows project', function() {
            beforeEach(function() {
                shell.cp('-rf', windows_testapp_jsproj, temp);
            });
            it('should special case config-file elements for windows', function() {
                var munger = new configChanges.PlatformMunger('windows', temp, 'unused', null, pluginInfoProvider);

                var munge = munger.generate_plugin_config_munge(pluginInfoProvider.get(configplugin), {});
                var packageAppxManifest = munge.files['package.appxmanifest'];
                var windows80AppxManifest = munge.files['package.windows80.appxmanifest'];
                var windows81AppxManifest = munge.files['package.windows.appxmanifest'];
                var winphone81AppxManifest = munge.files['package.phone.appxmanifest'];
                var windows10AppxManifest = munge.files['package.windows10.appxmanifest'];

                expect(packageAppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-all-appxmanifest-target-files" />');
                expect(windows80AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win8-only" />');
                expect(windows80AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-win-only" />');
                expect(windows80AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
                expect(windows81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win81-win-and-phone" />');
                expect(windows81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-win-only" />');
                expect(windows81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win81-win-and-phone" />');
                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win81-phone-only" />');
                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
                expect(windows10AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-in-win10-only" />');
            });
        });
    });

    describe('processing of plugins (via process method)', function() {
        beforeEach(function() {
            shell.cp('-rf', dummyplugin, plugins_dir);
        });
        it('should generate config munges for queued plugins', function() {
            shell.cp('-rf', android_two_project, temp);
            var platformJson = PlatformJson.load(plugins_dir, 'android');
            platformJson.root.prepare_queue.installed = [{'plugin':'org.test.plugins.dummyplugin', 'vars':{}}];
            var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
            var spy = spyOn(munger, 'generate_plugin_config_munge').andReturn({});
            munger.process(plugins_dir);
            expect(spy).toHaveBeenCalledWith(jasmine.any(PluginInfo), {});
        });
        describe(': installation', function() {
            describe('of xml config files', function() {
                beforeEach(function() {
                    shell.cp('-rf', android_two_project, temp);
                });
                it('should call graftXML for every new config munge it introduces (every leaf in config munge that does not exist)', function() {
                    var platformJson = PlatformJson.load(plugins_dir, 'android');
                    platformJson.root.prepare_queue.installed = [{'plugin':'org.test.plugins.dummyplugin', 'vars':{}}];

                    var spy = spyOn(xml_helpers, 'graftXML').andReturn(true);

                    var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                    munger.process(plugins_dir);
                    expect(spy.calls.length).toEqual(4);
                    expect(spy.argsForCall[0][2]).toEqual('/*');
                    expect(spy.argsForCall[1][2]).toEqual('/*');
                    expect(spy.argsForCall[2][2]).toEqual('/manifest/application');
                    expect(spy.argsForCall[3][2]).toEqual('/cordova/plugins');
                });
                it('should not call graftXML for a config munge that already exists from another plugin', function() {
                    shell.cp('-rf', configplugin, plugins_dir);
                    var platformJson = PlatformJson.load(plugins_dir, 'android');
                    platformJson.addInstalledPluginToPrepareQueue('org.test.configtest', {});

                    var spy = spyOn(xml_helpers, 'graftXML').andReturn(true);
                    var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                    munger.process(plugins_dir);
                    expect(spy.calls.length).toEqual(1);
                });
                it('should not call graftXML for a config munge targeting a config file that does not exist', function() {
                    var platformJson = PlatformJson.load(plugins_dir, 'android');
                    platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.dummyplugin', {});

                    var spy = spyOn(fs, 'readFileSync').andCallThrough();

                    var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                    munger.process(plugins_dir);
                    expect(spy).not.toHaveBeenCalledWith(path.join(temp, 'res', 'xml', 'plugins.xml'), 'utf-8');
                });
            });
            describe('of plist config files', function() {
                it('should write empty string nodes with no whitespace', function() {
                    shell.cp('-rf', ios_config_xml, temp);
                    shell.cp('-rf', varplugin, plugins_dir);
                    var platformJson = PlatformJson.load(plugins_dir, 'ios');
                    platformJson.addInstalledPluginToPrepareQueue('com.adobe.vars', {});
                    configChanges.process(plugins_dir, temp, 'ios', platformJson, pluginInfoProvider);
                    expect(fs.readFileSync(path.join(temp, 'SampleApp', 'SampleApp-Info.plist'), 'utf-8')).toMatch(/<key>APluginNode<\/key>\n    <string><\/string>/m);
                });
                it('should merge dictionaries and arrays, removing duplicates', function() {
                    shell.cp('-rf', ios_config_xml, temp);
                    shell.cp('-rf', plistplugin, plugins_dir);
                    var platformJson = PlatformJson.load(plugins_dir, 'ios');
                    platformJson.addInstalledPluginToPrepareQueue('org.apache.plist', {});
                    configChanges.process(plugins_dir, temp, 'ios', platformJson, pluginInfoProvider);
                    expect(fs.readFileSync(path.join(temp, 'SampleApp', 'SampleApp-Info.plist'), 'utf-8')).toMatch(/<key>UINewsstandIcon<\/key>[\s\S]*<key>CFBundlePrimaryIcon<\/key>/);
                    expect(fs.readFileSync(path.join(temp, 'SampleApp', 'SampleApp-Info.plist'), 'utf-8')).toMatch(/<string>schema-b<\/string>/);
                    expect(fs.readFileSync(path.join(temp, 'SampleApp', 'SampleApp-Info.plist'), 'utf-8')).not.toMatch(/(<string>schema-a<\/string>[^]*){2,}/);
                    expect(fs.readFileSync(path.join(temp, 'SampleApp', 'SampleApp-Info.plist'), 'utf-8')).not.toMatch(/(<string>schema-c<\/string>[^]*){2,}/);
                });
            });
            describe('of pbxproject framework files', function() {
                var xcode_add;
                beforeEach(function() {
                    shell.cp('-rf', ios_config_xml, temp);
                    shell.cp('-rf', cbplugin, plugins_dir);
                    xcode_add = spyOn(xcode.project.prototype, 'addFramework').andCallThrough();
                });
                it('should call into xcode.addFramework if plugin has <framework> file defined and is ios',function() {
                    var platformJson = PlatformJson.load(plugins_dir, 'ios');
                    platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.childbrowser', {});
                    var munger = new configChanges.PlatformMunger('ios', temp, platformJson, pluginInfoProvider);
                    munger.process(plugins_dir);
                    expect(xcode_add).toHaveBeenCalledWith('libsqlite3.dylib', {weak:false});
                    expect(xcode_add).toHaveBeenCalledWith('social.framework', {weak:true});
                    expect(xcode_add).toHaveBeenCalledWith('music.framework', {weak:false});
                    expect(xcode_add).not.toHaveBeenCalledWith('Custom.framework');
                });
            });
            it('should resolve wildcard config-file targets to the project, if applicable', function() {
                shell.cp('-rf', ios_config_xml, temp);
                shell.cp('-rf', cbplugin, plugins_dir);
                var platformJson = PlatformJson.load(plugins_dir, 'ios');
                platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.childbrowser', {});
                var spy = spyOn(fs, 'readFileSync').andCallThrough();

                var munger = new configChanges.PlatformMunger('ios', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);
                expect(spy).toHaveBeenCalledWith(path.join(temp, 'SampleApp', 'SampleApp-Info.plist').replace(/\\/g, '/'), 'utf8');
            });
            it('should move successfully installed plugins from queue to installed plugins section, and include/retain vars if applicable', function() {
                shell.cp('-rf', android_two_project, temp);
                shell.cp('-rf', varplugin, plugins_dir);
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('com.adobe.vars', {'API_KEY':'hi'}, true);

                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                expect(platformJson.root.prepare_queue.installed.length).toEqual(0);
                expect(platformJson.root.installed_plugins['com.adobe.vars']).toBeDefined();
                expect(platformJson.root.installed_plugins['com.adobe.vars']['API_KEY']).toEqual('hi');
            });
        });

        describe(': uninstallation', function() {
            it('should call pruneXML for every config munge it completely removes from the app (every leaf that is decremented to 0)', function() {
                shell.cp('-rf', android_two_project, temp);

                // Run through an "install"
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.dummyplugin', {});
                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                // Now set up an uninstall and make sure prunexml is called properly
                platformJson.addUninstalledPluginToPrepareQueue('org.test.plugins.dummyplugin');
                var spy = spyOn(xml_helpers, 'pruneXML').andReturn(true);
                munger.process(plugins_dir);
                expect(spy.calls.length).toEqual(4);
                expect(spy.argsForCall[0][2]).toEqual('/*');
                expect(spy.argsForCall[1][2]).toEqual('/*');
                expect(spy.argsForCall[2][2]).toEqual('/manifest/application');
                expect(spy.argsForCall[3][2]).toEqual('/cordova/plugins');
            });
            it('should generate a config munge that interpolates variables into config changes, if applicable', function() {
                shell.cp('-rf', android_two_project, temp);
                shell.cp('-rf', varplugin, plugins_dir);
                // Run through an "install"
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('com.adobe.vars', {'API_KEY':'canucks'});
                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                // Now set up an uninstall and make sure prunexml is called properly
                platformJson.addUninstalledPluginToPrepareQueue('com.adobe.vars');
                var spy = spyOn(munger, 'generate_plugin_config_munge').andReturn({});
                munger.process(plugins_dir);
                var munge_params = spy.mostRecentCall.args;
                expect(munge_params[0]).toEqual(jasmine.any(PluginInfo));
                expect(munge_params[0].dir).toEqual(path.join(plugins_dir, 'com.adobe.vars'));
                expect(munge_params[1]['API_KEY']).toEqual('canucks');
            });
            it('should not call pruneXML for a config munge that another plugin depends on', function() {
                shell.cp('-rf', android_two_no_perms_project, temp);
                shell.cp('-rf', childrenplugin, plugins_dir);
                shell.cp('-rf', shareddepsplugin, plugins_dir);

                // Run through and "install" two plugins (they share a permission for INTERNET)
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('org.test.multiple-children', {});
                platformJson.addInstalledPluginToPrepareQueue('org.test.shareddeps', {});
                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                // Now set up an uninstall for multi-child plugin
                platformJson.addUninstalledPluginToPrepareQueue('org.test.multiple-children');
                munger.process(plugins_dir);
                munger.save_all();
                var am_xml = new et.ElementTree(et.XML(fs.readFileSync(path.join(temp, 'AndroidManifest.xml'), 'utf-8')));
                var permission = am_xml.find('./uses-permission');
                expect(permission).toBeDefined();
                expect(permission.attrib['android:name']).toEqual('android.permission.INTERNET');
            });
            it('should not call pruneXML for a config munge targeting a config file that does not exist', function() {
                shell.cp('-rf', android_two_project, temp);
                // install a plugin
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('org.test.plugins.dummyplugin', {});
                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                // set up an uninstall for the same plugin
                platformJson.addUninstalledPluginToPrepareQueue('org.test.plugins.dummyplugin');

                var spy = spyOn(fs, 'readFileSync').andCallThrough();
                munger.process(plugins_dir);

                expect(spy).not.toHaveBeenCalledWith(path.join(temp, 'res', 'xml', 'plugins.xml'), 'utf-8');
            });
            it('should remove uninstalled plugins from installed plugins list', function() {
                shell.cp('-rf', android_two_project, temp);
                shell.cp('-rf', varplugin, plugins_dir);
                // install the var plugin
                var platformJson = PlatformJson.load(plugins_dir, 'android');
                platformJson.addInstalledPluginToPrepareQueue('com.adobe.vars', {'API_KEY':'eat my shorts'});
                var munger = new configChanges.PlatformMunger('android', temp, platformJson, pluginInfoProvider);
                munger.process(plugins_dir);

                // queue up an uninstall for the same plugin
                platformJson.addUninstalledPluginToPrepareQueue('com.adobe.vars');
                munger.process(plugins_dir);

                expect(platformJson.root.prepare_queue.uninstalled.length).toEqual(0);
                expect(platformJson.root.installed_plugins['com.adobe.vars']).not.toBeDefined();
            });
        });
    });
});

redpajama_set_name: RedPajamaGithub


Human Body Picture For Kids human body picture for kids human body printables homeschooling ideas para ensear human. human body picture for kids images of the human body for kids anmelden templates. human body picture for kids anatomy to kids google search teach anatomy human body bones template. Human Body Picture For Kids human body picture for kids my body educational infographic chart kids stock vector royalty. human body picture for kids organs of the human body diagram for kids anmelden ideas. human body picture for kids youtube science videos teaching human body to kids printable. Human Body Picture For Kids human body picture for kids human body parts for kids.
Human Body Picture For Kids human body picture for kids images of the human body for kids anmelden templates. human body picture for kids anatomy to kids google search teach anatomy human body bones template. human body picture for kids my body educational infographic chart kids stock vector royalty. human body picture for kids organs of the human body diagram for kids anmelden ideas. human body picture for kids youtube science videos teaching human body to kids printable.


text:
How Do You Solve A Problem Like Kozinski?
Chief Judge Sidney Thomas has announced that a formal inquiry has been initiated into allegations of misconduct by Ninth Circuit Judge Alex Kozinski.
"In the past, when incidents of alleged misconduct have been reported in an accredited media publication, we have identified a complaint and initiated an inquiry," wrote Chief Judge Sidney Thomas in an order issued Thursday afternoon.
The order indicated that Thomas was initiating a complaint himself based on a Dec. 8 report from The Washington Post that reported that six former clerks or externs at the court accused Kozinski of asking them to view pornography or subjected them to inappropriate comments. More women have since come forward with similar allegations.
C.J. Thomas has asked Chief Justice Roberts to transfer the complaint to another circuit "to ensure confidence in the impartiality" of the inquiry. This is both huge and proper. A wealth of allegations have been made, raising grave questions as to Judge Kozinski's behavior, judgment and "handling" of the power and authority he wielded.
The inquiry will enable the alleged "victims" to assert their allegations against the judge, and the judge to address them. What comes of it will be whatever the Least Dangerous Branch decides, whether it's admonishment or referral for impeachment.
It has also been reported that three of Kozinski's law clerks have resigned. Not because they claim to have been abused or harassed, but because they're embarrassed.
As one tipster noted, working for Kozinski went from a cocktail-party feather in your cap to an embarrassment.
Working in the chambers of a Supreme Court feeder was cool. Working in the chambers of a sex perv, not so much. A number of other virtues are implicated by a federal circuit judge clerkship, but they're low value in comparison to prestige.
At PrawfsBlawg, Cassandra Burke Robertson called for Kozinski's impeachment, replete with the litany of female oppression, having nothing specifically to do with Kozinski but required of any properly woke academic to set the tone, as well as her devotion to the genius of Heidi Bond's romance novels.
But it's hard not to count the loss to the legal profession when women lawyers find their careers derailed by harassment and discrimination—when they are treated, in Traister's words, as "fundamentally erotic, ornamental; [and] have not been taken seriously as equals." Even though men and women have been attending law school at the same rates for many years now, women still make up only 20% of law firm partners and 24% of general counsels. There is still a pay disparity.
As long as Judge Kozinski stays on the bench, the cost to the legal profession will be too high. It is time for him to go, whether voluntarily or otherwise.
It's dangerous in academia to point out the fallacies of this argument, the worst of which is calling for his death sentence before his conviction. But shallow minds beget shallow argument, much as they appeal to the sensibilities of the unduly passionate. It comes as no surprise that the mob would "believe the women," but that someone allowed to teach law would lead the mob is disconcerting. Then again, that's become a thing among academics of late.
Even the New York Times is reluctant to go full Red Queen on Kozinski.
What is the right way to deal with unacceptable conduct over many years by a life-tenured judge? The Constitution says federal judges "shall hold their offices during good behavior." By any reasonable measure, Judge Kozinski's behavior has not been good for a long time, yet he has been able to skate by.
Well, one "reasonable measure" would be due process rather than untested allegations, some of rather dubious significance, even if from multiple women. As for "skate by," that would be the passive way of saying because the accusers said nothing, but the New York Times doesn't engage in victim blaming.
No longer, as the nation engages in a long-overdue moment of reckoning with the sheer breadth of sexual harassment and predation by powerful men, and its impact on the lives of working women. Some of these men have committed graver offenses than Judge Kozinski stands accused of. But sexual misconduct by a federal judge is particularly troublesome, both because the American public pays the judge's salary, and because trust in the judiciary depends on judges being seen as not simply independent, but above reproach.
That Kozinski's salary is paid by the public is weak sauce. That trust in the judiciary demands that judges be above reproach, on the other hand, is extremely important.
And then there are the very reasonable concerns about Judge Kozinski's ability to hear a sexual-harassment or discrimination case; how could any plaintiff be confident the judge would give her a fair hearing?
A judge's fairness is, indeed, a very reasonable concern, but it should be based on his rulings, not on assumptions about his personal life. At least not in a rational world.
There's a good reason for keeping impeachment of judges very rare: The federal judiciary must remain as free as possible from intrusion by the political branches. But that is not a defense if the judiciary itself can't meaningfully address unacceptable behavior in its ranks. Judge Kozinski's case provides an opportunity to show that it can.
And this is very true, though perhaps not quite what the editors have in mind, particularly given that the Times has done everything possible to politicize the judiciary, to create the impression that they can't be trusted and they're just shills for their political patrons. So now they dare the judiciary to police itself, to "show that it can."
In other words, conduct an inquiry. Use the mechanisms the law provides for the judges to judge themselves. Then hang the bastard.
Whether anyone is brave enough, or foolish enough, to come forward to defend Kozinski against the allegations is unlikely. His conduct was reprehensible, if true, even if a far cry from the allegations against Weinstein. Koz is a judge, and as a judge, is properly held to a higher standard. So let the inquiry happen. And let him get what he deserves, whatever that may be.
This entry was posted in Uncategorized on December 15, 2017 by SHG.
← Trapping The Lonely Seaton: Ten Questions Every Criminal Defense Lawyer Should Ask On The First Date →
30 thoughts on "How Do You Solve A Problem Like Kozinski?"
B. McLeod December 15, 2017 at 8:24 am
"A Supreme Court feeder." So. The Justices are dirty, rotten enablers who facilitated his recruitment of alleged victims.
SHG Post author December 15, 2017 at 8:30 am
If the narrative fits, well…
Richard Kopf December 15, 2017 at 9:43 am
SHG,
For whatever they may be worth, I have several observations.
First, even if one accepts all the allegations made against Judge Kosinski as true, nothing I have read comes close to an impeachable offense. One would have thought Cassandra Burke Robertson would have taken the time to articulate why she believes impeachment is warranted and provide some reasoning.
For example, she might have consulted and tried to apply the following precedents:
John Pickering, U.S. District Court for the District of New Hampshire.
Impeached by the U.S. House of Representatives on March 2, 1803, on charges of mental instability and intoxication on the bench; Convicted by the U.S. Senate and removed from office on March 12, 1804.
Samuel Chase, Associate Justice, Supreme Court of the United States.
Impeached by the U.S. House of Representatives on March 12, 1804, on charges of arbitrary and oppressive conduct of trials; Acquitted by the U.S. Senate on March 1, 1805.
James H. Peck, U.S. District Court for the District of Missouri.
Impeached by the U.S. House of Representatives on April 24, 1830, on charges of abuse of the contempt power; Acquitted by the U.S. Senate on January 31, 1831.
West H. Humphreys, U.S. District Court for the Middle, Eastern, and Western Districts of Tennessee.
Impeached by the U.S. House of Representatives, May 6, 1862, on charges of refusing to hold court and waging war against the U.S. government; Convicted by the U.S. Senate and removed from office, June 26, 1862.
Mark W. Delahay, U.S. District Court for the District of Kansas.
Impeached by the U.S. House of Representatives, February 28, 1873, on charges of intoxication on the bench; Resigned from office, December 12, 1873, before opening of trial in the U.S. Senate.
Charles Swayne, U.S. District Court for the Northern District of Florida.
Impeached by the U.S. House of Representatives, December 13, 1904, on charges of abuse of contempt power and other misuses of office; Acquitted by the U.S. Senate February 27, 1905.
Robert W. Archbald, U.S. Commerce Court.
Impeached by the U.S. House of Representatives, July 11, 1912, on charges of improper business relationship with litigants; Convicted by the U.S. Senate and removed from office, January 13, 1913.
George W. English, U.S. District Court for the Eastern District of Illinois.
Impeached by the U.S. House of Representatives, April 1, 1926, on charges of abuse of power; Resigned from office November 4, 1926; Senate Court of Impeachment adjourned to December 13, 1926, when, on request of the House manager, impeachment proceedings were dismissed.
Harold Louderback, U.S. District Court for the Northern District of California.
Impeached by the U.S. House of Representatives, February 24, 1933, on charges of favoritism in the appointment of bankruptcy receivers; Acquitted by the U.S. Senate on May 24, 1933.
Halsted L. Ritter, U.S. District Court for the Southern District of Florida.
Impeached by the U.S. House of Representatives, March 2, 1936, on charges of favoritism in the appointment of bankruptcy receivers and practicing law while sitting as a judge; Convicted by the U.S. Senate and removed from office, April 17, 1936.
Harry E. Claiborne, U.S. District Court for the District of Nevada.
Impeached by the U.S. House of Representatives, July 22, 1986, on charges of income tax evasion and of remaining on the bench following criminal conviction; Convicted by the U.S. Senate and removed from office, October 9, 1986.
Alcee L. Hastings, U.S. District Court for the Southern District of Florida.
Impeached by the U.S. House of Representatives, August 3, 1988, on charges of perjury and conspiring to solicit a bribe; Convicted by the U.S. Senate and removed from office, October 20, 1989.
Walter L. Nixon, U.S. District Court for the Southern District of Mississippi.
Impeached by the U.S. House of Representatives, May 10, 1989, on charges of perjury before a federal grand jury; Convicted by the U.S. Senate and removed from office, November 3, 1989.
Samuel B. Kent, U.S. District Court for the Southern District of Texas.
Impeached by the U.S. House of Representatives, June 19, 2009, on charges of sexual assault, obstructing and impeding an official proceeding, and making false and misleading statements; Resigned from office, June 30, 2009. On July 20, 2009, the U.S. House of Representatives agreed to a resolution not to pursue further the articles of impeachment, and on July 22, 2009, the Senate, sitting as a court of impeachment, dismissed the articles. (Kent was charged and convicted of the crime of lying under oath to the judicial committee that commenced an investigation and he was sentenced to prison.)
G. Thomas Porteous, Jr., U.S. District Court for the Eastern District of Louisiana.
Impeached by the U.S. House of Representatives, March 11, 2010, on charges of accepting bribes and making false statements under penalty of perjury; Convicted by the U.S. Senate and removed from office, December 8, 2010.
Second, the exception to my first point may be that Judge Kosinski lied to the special committee the first time around during cow-gate. But that is highly fact-dependent and no one on the outside has any way of knowing whether he lied or not. However, you can bet that the judicial investigating committee will look hard into that matter.
Third, if one accepts Heidi Bond's articulation of her experiences as true because she swore to them under oath, and other women attest to such an environment under oath, I am of the opinion that the Judicial Council of the Circuit to which this matter is assigned could and should do the following:
The Chief Judge of the Circuit and the Circuit Judicial Council should strip the judge of his ability to hear cases for as long as the law allows. See 28 U.S. Code § 354(a)(2)(A)(i) ("ordering that, on a temporary basis for a time certain, no further cases be assigned to the judge whose conduct is the subject of a complaint"). They should also publicly reprimand him and formally request that he resign. Id.§ 354(a)(2)(A)(ii-iii) & § 354(a)(2)(B)(ii).
Finally, and as you say, under the law, judge Kosinski stands accused and not convicted. Simple justice requires more than lip service to that important point.
Imagine a law professor, or a great many law professors, seeking their answers in law, precedent and deliberate reason.
Ross December 15, 2017 at 10:11 am
To many of the law profs making these bizarre arguments, acknowledging precedent and the writings of others would pop the bubble of "I am the greatest thinker ever, and don't need to consult with historical losers and the drivel they spewed". There are days when I start to think that some mandatory egoectomies are in order for certain portions of academia…
TLN December 15, 2017 at 12:24 pm
RGK,
What role should the Constitution's Good Behavior Clause (GBC) play in determining consequences for Kozinski's alleged misconduct (assuming he receives due process & the allegations are proven)?
Or, stated differently, if Kozinski refuses to resign can the judicial branch rely on the GBC to remove him from the bench, even if his misconduct does not rise to the level of a "high crime" impeachable offense?
Pedantic Grammar Police December 15, 2017 at 12:52 pm
The GBC has never been used to remove an Article 3 judge, and legal scholars assert that it cannot be so used. An Article 3 judge can only be removed by Congress via impeachment.
http://www.heritage.org/constitution/#!/articles/3/essays/104/good-behavior-clause
SHG Post author December 15, 2017 at 1:10 pm
I left the link in (against my better judgment) and allowed your comment (even though you're not a lawyer and what the hell are you thinking about answering a question to Judge Kopf, anyway?), but strongly suggest that you consider whether you want to be exiled to reddit if you can't restrain this inexplicable new urge you have to overreach your grasp.
Pedantic Grammar Police December 15, 2017 at 1:42 pm
Sorry, Pedantic Grammar Police are mindlessly compelled to overreach our grasp. It's a disability. Just imagine what I'm like at the karaoke bar.
I'm literally shaking.
Judges should be held to a higher standard than other professions because their job is to possess and display good judgment. They usually are not held to a higher standard. Many judges who clearly display poor judgment continue to be judges, and judges who should be successfully impeached are acquitted. This damages the credibility of our system. Maybe this is a good thing; maybe a loss of credibility will motivate change.
Jim Tyre December 15, 2017 at 12:40 pm
Judge Kopf,
Thank you for the list of federal judges who have been impeached by the House. I knew of some, but not nearly all.
Precedent would also include federal judges against whom impeachment proceedings were begun (referral to House Judiciary with the relevant subcommittee taking some action), but who neither resigned nor were impeached. I don't have a complete list, but there are many. William O. Douglas would make two appearances on such a list. One of my local district judges, Manuel Real, also would be on it.
Admittedly an aside, but Alcee Hastings has always been my "favorite" on your list. A few years after, he was elected to Congress and is still there twentysomething years later. He even survived a sexual harassment lawsuit filed against him by one of his Congressional staffers.
ShelbyC December 15, 2017 at 10:17 am
If you don't like porn, you ask him not to show you any more? That's how we used to solve these problems.
SHG Post author December 15, 2017 at 10:34 am
If you don't want him to kiss you on the cheek "for a couple seconds too long," you ask him not to kiss you on the cheek. I believe that's now called victim blaming and it's not allowed.
Lee December 15, 2017 at 11:36 am
That's because women are dainty, fragile flowers, prone to nasty feelings of fear and revulsion, that must be protected from the depredations of men. Except when they are strong, independent woman who can do anything a man can do.
It is so confusing.
wilbur December 15, 2017 at 11:40 am
I was raised in the Midwest where we didn't do cheek or air kisses. You gave your mother or Aunt Alice a kiss on the cheek and a hug. And that was the extent of it.
I've never felt comfortable with the whole routine of having to lean in and go through that charade. And I'm sure it shows.
I despise it. While it's common within my "crowd," I don't like being hugged or kissed by random women. But I do it or my wife kicks me, because reasons. I feel abused.
Charles December 15, 2017 at 12:09 pm
It's not historically an American custom. Tell them that you're offended by their cultural appropriation.
SHG Post author December 15, 2017 at 12:11 pm
I am offended. I AM!!!
John Barleycorn December 15, 2017 at 12:37 pm
If this lands in the 5th Circuit, you just know that Tipper Gore is going to shows up and start playing Prince albums backwards on the court house steps right? So what then?! Trump nominates Tipper for that slot that Mr. Mateer was supposed to get in the Eastern District of Texas?
And what happens if Grassley steps out of bounds here and starts doing doughnuts around the courts silage in the silo, and that turns on Feinstein so much that she rapes him?
Sidney Thomas is a good guy and all but WTF?! Pawning off the business of your own woodshed is weak even if it looks "proper". Alex can handle it and you guys can handle him. Stop acting like a bunch of children.
Jyjon December 15, 2017 at 12:55 pm
MonitorsMost December 15, 2017 at 1:11 pm
"It has also been reported that three of Kozinski's law clerks have resigned."
Where do I send my resume? Oh, I'd have to live in Los Angeles? That's a deal breaker.
You might be able to do distance clerking. I hear he has the internet.
John Barleycorn December 15, 2017 at 1:57 pm
You never saw the Judge's speech on technology esteemed one? Long distance clerking is out.
Besides MonitorsMost just isn't up to it. Everyone has heard the rumors and can handle "what single girls do for sex in San Francisco" even the ones that work in the the AT&T building, but I heard, that when MonitorsMost heard, what the single girls in Pasadena do for sex he started having nightmares about what Rachel Brand has been whispering in the ear of Jeff sessions concerning the FISA Amendments Act Section 702 being enshrined forever come 12/31/17 and just chickened out.
Lex December 16, 2017 at 10:23 am
Great learning experience, I'm told. Has some drawbacks, though:
Kozinski: There aren't that many hours in a year. How many?
Bernstein: About 8,000….
Kozinski: So you sleep 1,000, and that leaves you will 7,000 hours. It seems to me that if you take seriously the idea that you're clerking in part to make the system better, you ought to spend those 7,000 hours working for a judge you disagree with.
Nobody forces you to be a clerk. Why would it make you cry if someone else chooses to do something you choose not to do? You do realize others aren't require to adhere to your feelz, right?
Lex December 16, 2017 at 1:16 pm
You get that the joke is about the implied 135 hour work week, right?
Seriously? Math? And you expect me to get it?
Richard Kopf December 15, 2017 at 2:05 pm
To all who have asked me questions regarding my comment,
For a fairly liberal but very thoughtful and easy to read elucidation of the law and practice of impeachment, as it regards federal judges, I suggest that you refer to the Statement of Arthur D. Hellman to the House Committee on the Judiciary, (June 3, 2009) on the Kent matter. The Hellman piece is a good primer, although it is only a primer.*
Finally, I don't intend to comment further here or anyplace else about the Kosinski matter. In short, I have said all I want to say.
* As some of you may know, I tried the impeachment of the Republican Attorney General in front of the Nebraska Supreme Court (Nebraska has a one-house legislature). In preparation, I spent time researching impeachment on the federal level. Ultimately, I concluded that the act of impeachment and conviction is a political act in the best sense of the word "political." But because it is "political" the process is hard to predict. That said, the historical precedents from the House and Senate provide a reasonable guide.
Patrick Maupin December 15, 2017 at 3:52 pm
Now I've got that stupid song stuck in my head. The company party starts in 10 minutes; maybe I can slam back enough alcohol to clean it out.
"The hills are aliiiiiiiive, and it creeps me owwwwwwt."
Scott H. Greenfield
Nothing in this blog constitutes legal advice. This is free. Legal advice you have to pay for.
Twitter: @ScottGreenfield
I allow thoughtful comments, but please keep yours civil and respectful. There are rules here. I reserve the right to delete or edit any/all comments. Links are not permitted in comments and will be deleted. If you don't like the rules, comment elsewhere. Volenti non fit injuria.
Donate To SJ
This blawg doesn't pay for itself, you know.
Condescendingly Quitting
Wrong Message On Right To Be A Juror
Rage Over Grace
Seaton: Deconstructing "The Purge"
A Short Chat Inside David Brooks' Head
When Prison Is A Better Option
Justice Mark Dwyer Won't Quit On Science
Harvard's Admissions, Race And Rights
Wrongful Conviction Day
JorgXMcKie on Wrong Message On Right To Be A Juror
Howl on Condescendingly Quitting
Miles on Ginger Baker
wilbur on Wrong Message On Right To Be A Juror
Howl on Wrong Message On Right To Be A Juror
cthulhu on Ginger Baker
SHG on Ginger Baker
Howl on Ginger Baker
Casual Lurker on Ginger Baker
SHG on Rage Over Grace
Blawgroll
New York Personal Injury Blog
SCOTUS Blog
Associates Mind
What About Clients?
My Shingle
Real Lawyers Have Blogs
Jonathan Turley's Blog
Criminal Defense Blawgs
Mark Bennett's Defending People
Appellate Squawk
Rick Horowitz's Probable Cause
Nathan Burney's The Criminal Lawyer
CrimLaw - From the Dark Side
Gamso, For The Defense
Grits For Breakfast
Greg Prickett's Lex Ferenda
Life at the Harris County CJC
Jamison Koehler's Blog
That's Right. We Bad. Kinda.
J. Greenfield, Designer (c) 2008
RSS is not dead yet
Archives Select Month October 2019 (13) September 2019 (58) August 2019 (63) July 2019 (63) June 2019 (61) May 2019 (50) April 2019 (62) March 2019 (63) February 2019 (59) January 2019 (61) December 2018 (62) November 2018 (65) October 2018 (67) September 2018 (40) August 2018 (66) July 2018 (63) June 2018 (68) May 2018 (67) April 2018 (62) March 2018 (71) February 2018 (63) January 2018 (63) December 2017 (78) November 2017 (82) October 2017 (78) September 2017 (72) August 2017 (81) July 2017 (78) June 2017 (71) May 2017 (71) April 2017 (78) March 2017 (56) February 2017 (57) January 2017 (69) December 2016 (71) November 2016 (60) October 2016 (72) September 2016 (67) August 2016 (68) July 2016 (67) June 2016 (68) May 2016 (73) April 2016 (75) March 2016 (79) February 2016 (70) January 2016 (76) December 2015 (62) November 2015 (72) October 2015 (74) September 2015 (65) August 2015 (68) July 2015 (64) June 2015 (58) May 2015 (63) April 2015 (52) March 2015 (53) February 2015 (61) January 2015 (72) December 2014 (60) November 2014 (64) October 2014 (68) September 2014 (61) August 2014 (71) July 2014 (61) June 2014 (63) May 2014 (69) April 2014 (65) March 2014 (63) February 2014 (60) January 2014 (64) December 2013 (64) November 2013 (64) October 2013 (65) September 2013 (62) August 2013 (60) July 2013 (69) June 2013 (62) May 2013 (65) April 2013 (61) March 2013 (58) February 2013 (59) January 2013 (57) December 2012 (56) November 2012 (46) October 2012 (56) September 2012 (53) August 2012 (56) July 2012 (54) June 2012 (55) May 2012 (58) April 2012 (48) March 2012 (45) February 2012 (23) January 2012 (56) December 2011 (65) November 2011 (66) October 2011 (65) September 2011 (62) August 2011 (60) July 2011 (62) June 2011 (71) May 2011 (70) April 2011 (63) March 2011 (72) February 2011 (66) January 2011 (65) December 2010 (78) November 2010 (69) October 2010 (80) September 2010 (72) August 2010 (84) July 2010 (71) June 2010 (82) May 2010 (74) April 2010 (75) March 2010 (80) February 2010 (69) January 2010 (61) December 2009 (80) November 2009 (70) October 2009 (74) September 2009 (80) August 2009 (63) July 2009 (78) June 2009 (83) May 2009 (77) April 2009 (80) March 2009 (81) February 2009 (84) January 2009 (89) December 2008 (95) November 2008 (89) October 2008 (96) September 2008 (100) August 2008 (96) July 2008 (93) June 2008 (120) May 2008 (114) April 2008 (133) March 2008 (137) February 2008 (124) January 2008 (139) December 2007 (124) November 2007 (110) October 2007 (83) September 2007 (66) August 2007 (81) July 2007 (87) June 2007 (63) May 2007 (52) April 2007 (18) March 2007 (19) February 2007 (5)

redpajama_set_name: RedPajamaCommonCrawl


Corda Campus has a wide range of offices at your disposal. In addition to renting out office space Corda Campus also rent incubation space, workshops, labs, archive and storage space. We can also provide your company with a tailor-made real estate solution that combines all of the above.
Just ask us, we will gladly think along with you!
The offices on Corda Campus are located in the various buildings on campus. Corda Campus will suggest a space that is suited to your specific needs. We can help you if you are looking for office space near your lab or workshop.
Currently we have 56,000 m² of offices, 8,000 m² of workshops, 1,200 m² of lab space and about 4,000 m² of smaller offices. Check the available space here or contact our team.
As your company grows, your real estate needs also change. On Corda Campus you can launch a start-up or establish a small satellite office in one of our smaller office and then move to one of the office buildings as you grow. You can produce your first prototypes in our labs or workshops. We even have options if you need an office building of your own. Kindly refer to our master plan which provides for the development of another 45,000 m² of office solutions.
The offices and spaces on Corda Campus are equipped with adapted technology. The offices have HVAC air conditioning. We can supply power, compressed air and so on to the workshops and the labs are equipped in line with your activities. The campus's internal structure means the buildings are highly accessible.
All the spaces are equipped with HVAC air conditioning. The reception and signage at the entrance of every building ensures that visitors can easily get to your offices and receive a professional welcome.
Contact us today for a tailor-made proposal for your company!


Always terrible with his sense of direction, comedian Tirumari Jothi takes the K instead of the M, and suddenly finds himself at Balboa Park station at 1 a.m. A conversation with a stranger helps him find his way back home to Park Merced, but not before the chat involved topics he never thought he'd hear.
Tirumari has been performing comedy for six years, with stand-up as his first love, but he also loves improv and sketch acting . You can find him either performing with the geeky comedy group he co-founded, Komedio Comedy, or acting on stage with Killing My Lobster (find him at Sketchfest 2018). You can find him on Twitter @tirumari.
Would love for you to embed the audio on your website 🙂 I love Tirumari and want to hear the episode, but your link only goes to the iTunes page with all of your episodes. Can't tell which has him.