{% extends "base_prepare.html" %}
{% set active_page = 'scrub' %}
{% block head %}
{% endblock %}
{% block title %}scrubber{% endblock %}
{% block options %}
{% if haveGutenberg %}
Warning!
One or more files you uploaded contain Project Gutenberg licensure material. You may want to remove the beginning and ending material, save, and re-upload. If you Apply Scrubbing and continue, Lexos will remove the majority of the Project Gutenberg Licensure, but there may still be some unwanted material left over.
{% endif %}
XML Handling
This is a temporary place filler for the future XML handling function.
Your XML file contains the elements listed below. Please select how you would like each tag to be treated.


| About Dailyrotten |
|
Feedback
If you like this page, hate it, or would like to suggest changes,
<EMAIL_ADDRESS>is listening. This page
is experimental and somewhat different from what we usually offer, so please
do send your feedback.
Adding Stories
If you are a rotten newshound and you would like to suggest a story,
visit our submit page to
send us the URL. Stories that are accepted will have your name credited.
Posting Comments
In order to post comments to stories, you will have to
create an account.
Accounts will generally be validated within 24 hours, and of
course will be disabled if there is abuse.
Viewership
On the first full day this page went live, 100,000 people visited this Rotten
News page. Of course that was the day after the WTC attacks, so that number is
somewhat distorted. Right now this page gets between 50,000 and 75,000 people
every day.
Linking
We encourage everyone to link to this page; if you like it, others probably
will as well.
Other Rotten
Rotten
Gaping Maw
Celebrity Morgue
Mugshots
Rotten Store
Rate My Poo
Rate My Kitten
Rate My Finger
Penny Postcards
Phallic
Boners
Home
Make Dailyrotten your start page
|
|
|
December 27, 2002
Top NYC official fired for stupid
New York Post | Submitted by: Marla Jones
"Mayor Bloomberg last night abruptly fired the head of the city's customer
service office, after The Post alerted City Hall that the official had called
New Yorkers and city workers "dumb," "whining" and "stupid"... "I take
painkillers, sleep a lot and think about killing every citizen and employee of
New York City every minute I'm awake," he fumed in the bizarre tirade."
|
|
Read article...
|
|
Hooters takes flight
CNN Money | Submitted by: Rockpile
"The chairman of Hooters America, Inc. said Thursday he bought an airline that
will operate a charter service under the name Hooters Air... Hooters did
not say it expects to have flight attendants in the restaurant's signature
tight tank-tops and orange shorts."
|
|
Read article...
|
|
Elderly drives golf cart onto interstate
South Florida Sun-Sentinel | Submitted by: Bald in NJ
"An 85 year old man became lost while driving his golf cart home from a
doctor's appointment inside a retirement community and wound up on a busy
interstate... The man drove along Interstate 75 near Tampa for about five
miles, his golf cart never topping 20 mph."
|
|
Read article...
|
|
Iran stops stonings of women adulterers
BBC | Submitted by: Phatlor
"Iran has abolished stoning as a form of capital punishment for women, a
senior judiciary official in Iran has been quoted as saying. Last year's
stonings were practically the only news about Iran carried by some Western
newspapers." The article does not say whether they will continue to topple
walls on homosexuals.
|
|
Read article...
|
|
What to do with the leftovers...
Press of Atlantic City | Submitted by: Dr. Atomic
"A man foraging through alley trash cans Friday found a foot and a hand that
had been hacked off a dead body. Authorities wouldn't say if the limbs belonged
to an adult or a child, but said the severed limbs were from a person who died
in the last week."
|
|
Read article...
|
|
A new form of counseling
Hartford Courant | Submitted by: Jamie
"A visiting Polish priest told police the sex he had last week with a teenage
rape victim in her family's apartment was a form of "counseling," intended to
show the high school girl that sex with men doesn't have to be bad."
|
|
Read article...
|
|
Children uncover porn in Barney book
CNN | Submitted by: zuzu
"Two youngsters who wanted to sing along with Barney the Dinosaur opened a
music book and discovered a photograph of a man and woman in a naked embrace.
The photo, which ran under the words "Wilder Sex," was in a "Sing-Along Songs
Barney" book a couple bought for their 4- and 7-year-old children."
|
|
Read article...
|
|
Rael: It's a girl (clone)
The Hindu | Submitted by: Reid Fleming
"Boisselier said the girl was born Thursday at 11:55 a.m., but did not
disclose where the cloning had taken place. She said results of genetic
testing of the child by an independent expert would be available in
eight to nine days." The Raelian swastika-cult is also building an embassy
for space visitors, but that's another story.
|
|
Read article...
|
|
Harpo Marx spied for FBI
Melbourne Herald Sun | Submitted by: Brocktoon
Soon to released government records will show how "the most anarchic of
the Marx Brothers" was recruited by the FBI in 1933 to spy on Stalin.
Apparently, Stalin was a big fan. Bomp Bomp!
|
|
Read article...
|
|
Judge lets pervert balloon artist be
Newsday | Submitted by: Dirty Sammy
Funny, it doesn't look like a long-nosed mouse: "A judge, taking away a
tool Westchester County had used to keep a convicted sex offender from
giving balloon sculptures to children, said the county cannot ban performances
aimed at soliciting donations in public parks... It resulted from a lawsuit
Hobbs brought in August 2000, saying the county had refused to let him perform
a clown act, give away balloon sculptures, engage in humorous social
commentary and accept donations from passers-by in 1999 and 2000."
|
|
Read article...
|
|
Republican family values
WBRZ-TV 2 Baton Rouge | Submitted by: wingnut
"State Sen. Jerry Thomas has pleaded no contest to lewd conduct in
connection with his Dec. 10 arrest in an eastern New Orleans adult
video store. A doctor and former Washington Parish coroner, Thomas was
arrested after police said they saw him engaged in a lewd act during
a raid at A&N Kola Video. Courcelle said Thomas decided to plead
no contest after talking with his wife and four children."
|
|
Read article...
|
|
Mistletoe Not as romantic as you think
ABC News | Submitted by: Rue LeJour
"It's one of the most ferocious weeds in nature, known for the way it worms
into tree branches and then sucks their nutrients from within. Secondly, it
spreads through the feces of bird droppings, which is how it got its name.
Mistol is the Anglo-Saxon word for "dung." And tan means "twig." So its
common name means "dung on a twig." The scientific name of the common American
species, Phoradendron, is not much better. It means "thief of the tree"
in Greek."
|
|
Read article...
|
|
Honesty is a better policy
Stuff NZ | Submitted by: wingnut
"A man was locked up on someone else's charges after he used the name of a
relative wanted by police.And now he's been charged over using the false name.
Christchurch man Ricky Humphries spent a week behind bars before prison
officials realised they had the wrong person. Even after he was released,
Humphries tried to keep his real identity a secret. "Every time we talked to
him he gave us a different name."
|
|
Read article...
|
|
FBI works to make homeland, uhh, secure
Minneapolis Star Tribune | Submitted by: wingnut
"The Star Tribune's Greg Gordon reported last week that at a quiet little
ceremony earlier this month, Marion (Spike) Bowman was one of nine people in
the bureau to receive an award for "exceptional performance." The award carries
with it a cash bonus of 20 to 35 percent of the recipient's salary and a framed
certificate signed by the president... Bowman heads the FBI's National Security
Law Unit. That's the unit that blocked Minneapolis agents from pursuing their
suspicions about Moussaoui."
|
|
Read article...
|
|
Woman jailed in cookie rage incident
WDIV-TV 4 Detroit | Submitted by<EMAIL_ADDRESS>"A Belleville woman who couldn't have the cookie she craved is behind bars
for attacking an employee at a shopping mall cookie stand, police said
Thursday. "She became enraged that they didn't have the cookie she wanted
to consume," said Ann Arbor police Sgt. Andrew Zazula."
|
|
Read article...
|
|
|
|
|


Please choose the best method to contact you:
Email
Telephone
Courier
Choose your monster's features:
Scales
Horns


Preparation time
less than 30 mins
Cooking time
30 mins to 1 hour
Serves
Serves 4
Lobster is a great meaty seafood that works wonderfully when given the Thai green curry treatment, especially when the curry paste is homemade too.
For the paste, place all the ingredients into a small food processor and blend until smooth.
For the lobster Thai curry, heat a wok, then add the paste and cook for 2-3 minutes.
Add the lime leaves, shrimp paste , cumin, coriander and paprika. Cook for one minute.
Add the coconut milk, fish sauce, tamarind, lime juice and palm sugar.
Meanwhile remove the meat from the lobster and chop the meat, leaving the claw intact.
Add the lobster to the wok and cook until the lobster is hot. Reduce the heat and let the curry simmer gently until ready to serve.
Meanwhile for the butter basmati rice, heat a medium saucepan and add one tablespoon of butter.
Once the butter has melted, add the cloves and cinnamon and cook for one minute. Add the rice and enough water to cover.
Cover with a lid and turn the heat down to the lowest setting and cook for 20 minutes. Turn off the heat and leave the lid on until ready to serve.
Just before serving stir the remaining butter though the rice.
To serve, serve the rice in a serving bowl along with the lobster curry, topped with coriander cress.


Operation to confiscate illegal arms in Arab communities
Not all the local Arab leadership is cooperating with the operation
by Arutz Sheva StaffAfter waves of violence in Arab towns across the country and call by Arab MKs and local leaders to put an end to the amount of illegal firearms in these communities the Ministry of Public Security announced an operation to collect these firearms.
However despite the promise that any people turning in firearms will not be prosecuted, some of the municipal leaders are not cooperating with this operation, including Umm al-Fahm,one of the larger Arab towns in Israel.
According to Yisrael HaYom, out of the 101 Arab municipalities, 12 refused to participate.


Uses of Class
com.arjuna.ats.internal.jts.orbspecific.coordinator.ArjunaTransactionImple
-
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.recovery.jts.jca.coordinator
Subclasses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.recovery.jts.jca.coordinator Modifier and Type Class Description class
RecoveredServerTransaction
Transaction type only instantiated at recovery time. -
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.tools.osb.mbean.jts
Subclasses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.tools.osb.mbean.jts Modifier and Type Class Description class
ArjunaTransactionImpleWrapper
Deprecated.as of 5.0.5.Final In a subsequent release we will change packages names in order to provide a better separation between public and internal classes.class
JCAServerTransactionWrapper
class
RecoveredTransactionWrapper
class
ServerTransactionWrapper
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.transaction.jts.subordinate.jca.coordinator
Subclasses of ArjunaTransactionImple in com.arjuna.ats.internal.jta.transaction.jts.subordinate.jca.coordinator Modifier and Type Class Description class
ServerTransaction
This looks like an Transaction, but is only created for importing transactions via JCA. -
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.interposition
Methods in com.arjuna.ats.internal.jts.interposition with parameters of type ArjunaTransactionImple Modifier and Type Method Description static ServerControl
ServerFactory. create_transaction(Uid u, org.omg.CosTransactions.Control parentControl, ArjunaTransactionImple parentImpl, org.omg.CosTransactions.Coordinator realCoord, org.omg.CosTransactions.Terminator realTerm, int time_out)
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.orbspecific
Fields in com.arjuna.ats.internal.jts.orbspecific declared as ArjunaTransactionImple Modifier and Type Field Description protected ArjunaTransactionImple
ControlImple. _transactionHandle
Methods in com.arjuna.ats.internal.jts.orbspecific that return ArjunaTransactionImple Modifier and Type Method Description ArjunaTransactionImple
ControlImple. getImplHandle()
Methods in com.arjuna.ats.internal.jts.orbspecific with parameters of type ArjunaTransactionImple Modifier and Type Method Description static org.omg.CosTransactions.Control
TransactionFactoryImple. create_subtransaction(org.omg.CosTransactions.Control control, ArjunaTransactionImple parent)
Non-idl methods, but we put them here because they are related to the work the factory does.Constructors in com.arjuna.ats.internal.jts.orbspecific with parameters of type ArjunaTransactionImple Constructor Description ControlImple(org.omg.CosTransactions.Control parentCon, ArjunaTransactionImple parentTran)
Create a new instance with the specified parent. -
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.orbspecific.coordinator
Fields in com.arjuna.ats.internal.jts.orbspecific.coordinator declared as ArjunaTransactionImple Modifier and Type Field Description protected ArjunaTransactionImple
ArjunaTransactionImple. parentTransaction
Constructors in com.arjuna.ats.internal.jts.orbspecific.coordinator with parameters of type ArjunaTransactionImple Constructor Description ArjunaTransactionImple(Uid actUid, org.omg.CosTransactions.Control myParent, ArjunaTransactionImple parent)
ArjunaTransactionImple(org.omg.CosTransactions.Control myParent, ArjunaTransactionImple parent)
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.orbspecific.interposition
Constructors in com.arjuna.ats.internal.jts.orbspecific.interposition with parameters of type ArjunaTransactionImple Constructor Description ServerControl(Uid actUid, org.omg.CosTransactions.Control parentCon, ArjunaTransactionImple parentTran, org.omg.CosTransactions.Coordinator realCoord, org.omg.CosTransactions.Terminator realTerm)
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.orbspecific.interposition.coordinator
Subclasses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.orbspecific.interposition.coordinator Modifier and Type Class Description class
ServerTransaction
This looks like an Transaction, but is only created for interposition purposes.Constructors in com.arjuna.ats.internal.jts.orbspecific.interposition.coordinator with parameters of type ArjunaTransactionImple Constructor Description ServerTransaction(Uid actUid, org.omg.CosTransactions.Control myParent, ArjunaTransactionImple parentImpl)
-
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.recovery.transactions
Subclasses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.recovery.transactions Modifier and Type Class Description class
AssumedCompleteHeuristicServerTransaction
class
AssumedCompleteHeuristicTransaction
class
AssumedCompleteServerTransaction
Transaction relic of a committed transaction that did not get committed responses from all resources/subordinates.class
AssumedCompleteTransaction
Transaction relic of a committed transaction that did not get committed responses from all resources/subordinates.class
RecoveredServerTransaction
Transaction type only instantiated at recovery time.class
RecoveredTransaction
Transaction type only instantiated at recovery time. -
Uses of ArjunaTransactionImple in com.arjuna.ats.internal.jts.resources
Constructors in com.arjuna.ats.internal.jts.resources with parameters of type ArjunaTransactionImple Constructor Description ExtendedResourceRecord(boolean propagate, Uid objUid, com.arjuna.ArjunaOTS.ArjunaSubtranAwareResource theResource, org.omg.CosTransactions.Coordinator myParent, Uid recCoordUid, ArjunaTransactionImple current)
ResourceRecord(boolean propagate, org.omg.CosTransactions.Resource theResource, org.omg.CosTransactions.Coordinator myParent, Uid recCoordUid, ArjunaTransactionImple current)
Constructor
-


Error handling utilities
- Source:
Methods
(static) handleAppError(err, req, res) → {void}
Express application default error handler.
Use this as a default error handler at the end of an app.js file with Express.
If there exists a defined err, then it logs to the console.error and sets the response status to 500 - Internal server error.
Parameters:
| Name | Type | Description |
|---|---|---|
err |
Error | The Error object from Express. |
req |
Object | The request object from Express. |
res |
Object | The response object from Express. |
- Source:
Returns:
.
- Type
- void
Example
var express = require('express');
var app = express();
var error = require('./lib/error-handling');
...
your apps routes go here
...
app.use(error.logAppError);
app.use(error.handleAppError);
(static) logAppError(err, req, res, next) → {void}
Express application error stack trace logger.
Use this as an error logger at the end of an app.js file with Express.
If there exists a defined err, then it logs a stack trace to the console.error.
The next() callback is invoked, passing the Error object.
Parameters:
| Name | Type | Description |
|---|---|---|
err |
Error | The Error object from Express. |
req |
Object | The request object from Express. |
res |
Object | The response object from Express. |
next |
function | callback function to the next route in Express. |
- Source:
Returns:
.
- Type
- void
Example
var express = require('express');
var app = express();
var error = require('./lib/error-handling');
...
your apps routes go here
...
app.use(error.logAppError);
app.use(error.handleAppError);
(inner) handleRequestError(req, res, next) → {void}
Request level error handler.
Request level error handler.
Parameters:
| Name | Type | Description |
|---|---|---|
req |
Object | The request object from Express. |
res |
Object | The response object from Express. |
next |
function | callback function to the next route in Express. |
- Source:
Returns:
.
- Type
- void
(inner) handleResponseError(req, res, next) → {void}
Response level error handler.
Response level error handler.
Parameters:
| Name | Type | Description |
|---|---|---|
req |
Object | The request object from Express. |
res |
Object | The response object from Express. |
next |
function | callback function to the next route in Express. |
- Source:
Returns:
.
- Type
- void


For counting loops it is best to use an integer for
the loop control variable.
However,
it is legal to use a floating point control variable and to use fractional increments.
The following program prints a table that displays
x
and ln(x)
for values of
x
from 0.1 up to about 2.0:
class LogTable { public static void main ( String[] args ) { System.out.println( "x" + "\t ln(x)" ); for ( double x = 0.1; x <= 2.0; x = x + 0.1 ) System.out.println( x + "\t" + Math.log( x ) ); } }
It compiles correctly, and runs. But its output is not pretty:
x ln(x) 0.1 -2.3025850929940455 0.2 -1.6094379124341003 0.30000000000000004 -1.203972804325936 0.4 -0.916290731874155 0.5 -0.6931471805599453 0.6 -0.5108256237659907 0.7 -0.35667494393873245 0.7999999999999999 -0.22314355131420985 0.8999999999999999 -0.1053605156578264 0.9999999999999999 -1.1102230246251565E-16 1.0999999999999999 0.09531017980432474 1.2 0.1823215567939546 1.3 0.26236426446749106 1.4000000000000001 0.336472236621213 1.5000000000000002 0.40546510810816455 1.6000000000000003 0.47000362924573574 1.7000000000000004 0.5306282510621706 1.8000000000000005 0.5877866649021193 1.9000000000000006 0.641853886172395
Remember (from a previous chapter) that floating point numbers are not absolutely accurate. In particular, 0.1 is always slightly wrong when represented inside a computer, no matter how many bits are used. The errors in x accumulate, and x drifts away from the desired value.
Notice that the last x
in the table is not 2.0 as
you would expect with accurate numbers.


Selected document: {{ title }}
{% if sections %}
{% for section in sections %}
({% if section.order %}order: {{ section.order }}{% else %}not ordered{% endif %})
created by {{ section.author_name }}
updated at {{ section.updated_at_full }}
(
edit)
(
delete section)
{{ section.content|safe }}
{% endfor %}
Click and drag section titles to reorder sections.
{% else %}
No sections in this document.
{% endif %}


Preparation time
1-2 hours
Cooking time
10 to 30 mins
Serves
Makes 6 flatbreads
Dietary
These breads are excellent with dips such as hummus, baba ganoush (roasted aubergine dip), or dipped in a mix of olive oil and balsamic vinegar. Great too for scooping up meat casseroles or gravy based dishes.
For the dough, sieve both flours into a large bowl. Mix in the yeast, sugar, zaatar and salt. In a separate bowl mix the warm water and oil together before adding to the dry ingredients. Mix until you have a soft, sticky dough then cover with a cloth and set aside to prove for 10 minutes.
Turn out the dough onto floured surface, and knead the dough for 10 minutes until you have a soft, shiny dough (add a little flour if needed).
Transfer the dough to an oiled bowl and turn it round so that its entire surface has a thin coat of oil. Cover with cling film and set aside to prove for up to an hour.
Flour your hands and knock back the dough by turning it over three to four times in its bowl. Transfer to a floured surface and divide the dough into six equal pieces and form each piece into a ball. Roll each ball out to form a circle approximately 18cm/7in wide and 3mm/⅛in thick (they do not need to be perfect circles). Place each circle on a lightly floured cloth.
Spray the dough circles lightly with water and sprinkle zaatar and sumac over the surface. Leave to prove again for 30 minutes.
Preheat the oven to maximum temperature; it needs to be very hot. Place an upturned roasting tray on the middle to lower shelf (the more uneven the surface the better, so use an old beaten up tray if you have one). Leave the tray to heat up for 20 minutes before baking the flatbreads.
Bake two or three flatbreads at a time for five minutes, or until the flatbreads are puffy and brown spots start to develop. Keep the oven door closed to avoid cooling the oven and keep checking the flatbreads while they cook - they can burn easily. Remove the flatbreads from the oven and place on a cooling rack. Cook the remaining dough circles.


Heroes: eLearning Protocol – User’s guide
1. Introduction
This document’s purpose is to provide instructions for the web game and present the concepts to the user in an easy to understand, friendly manner.
2. Login & Registration
Here you can start your learning journey be registering an account by completing the information needed in the fields provided. After that, you can sign in with your account every time you want to log in the application. It’s pretty self-explanatory 😊 .
3. Main Page
Now this is where the magic happens. After logging in, you will be redirected to the main page where you have multiple options:
- Wiki – redirects you to the wiki page where you have information about all the heroes
- Articles – Scholarly HTML articles regarding requirements, the user's guide and technical details
- Leaderboard – Redirects you to a leaderboard containing the top scores achieved by players in battle mode
- Logout – Located on the middle section on the top-left, logs you out of your account and redirects you to the login page
- Learning – Select a superhero for which you can choose to read the wiki page related to him, or go into learning mode where you can earn the superhero by answering questions related to his wiki, so you can use him in battle mode
- Battle – Choose one of your heroes to use his abilities so you can score as many points as possible to be featured in the leaderboard
4. Wiki
Choose a character to learn information about the domain associated to him, or just other trivial facts about the hero.
5. Leaderboard
This is where you can see the top 100 scores achieved by other players in battle mode and what heroes they used to achieve it. You can choose to use the button in the top-right corner to get the rankings as a RSS feed.
6. Articles
Scholarly HTML articles regarding requirements, the user's guide and technical details.
7. Learning mode
This is where you can unlock heroes for you to use in battle mode. All the knowledge needed to pass this quiz will be provided in the wiki section associated to the superhero. Answer all 10 questions and then submit them using the button at the bottom of the page. If you answered all of them correctly, you unlock the hero. If not, you will be shown which answers were correct and which not and you can try again. Come back here every time you want to refresh your knowledge about a subject.
7. Battle mode
Here is where you can use the knowledge you learned and the heroes you achieved to compete and earn your spot on the leaderboard. Each hero has a specific ability that they can use when a question related to their domain comes up. Use the ability by hitting the button on the bottom left. Choose the correct answer and be careful to not lose your lives. The game ends when you answer all of the questions available or when you lose all your lives. A game over screen will be displayed with your final score and the time. The final score is calculated by multiplying the score with the specific time multiplier. You can choose to take the quiz again, go to the main page or check the leaderboard.


Your seat reservations
Passenger name
Meal
Surcharge
Remove
Reserve another seat
Your seat reservations (
)
Total surcharge: $


We got blockchain!
- scale one-to-one web-readiness
- aggregate visionary action-items
- monetize value-added infrastructures
- morph best-of-breed solutions
- deliver value-added mindshare
- implement extensible web services
- benchmark distributed networks
- brand cutting-edge relationships
- repurpose 24/365 markets
- aggregate magnetic networks
- brand magnetic partnerships
- enable holistic e-tailers


UNITED NATIONS STAFF 1% FOR DEVELOPMENT FUND
Menu
About
Home
Become a Member
Projects
How to Apply
Application Form
FAQ
Contact
APPLICATION FORM
Email Address
Question 1: The title of your project
Question 2: What country is this project in?
Question 3: What is the exact location of the project within the country (village, neighbourhood, district, province)?
Question 4: What is the cost of this project(in US dollars)?
Question 5: What is being requested from the 1% Fund? From other sources?
Question 6: What is the total budget? How will that budget be used and allocated?
Question 7: Who is going to carry out the project? Will there be hired labourers or salaried experts?
Question 8: Who is preparing and submitting this request? Who will benefit from the project (also approximately how many people)?
Question 9: On whose initiative is the project being started?
Question 10: What is the present situation that the project seeks to improve? Why is the project necessary?
Question 11: What is the aim of the project? What does the project hope to achieve?
Question 12: Who are the people that will benefit from the project?
Question 13: How many people (approximately) will benefit from the project?
Question 14: What resources will come from the local community and beneficiaries?
Question 15: Who is responsible for the project? With whom will the 1% Fund maintain contact (name, address)?
Question 16: How will the results or achievements of the project be measured?
Question 17: What is the banking information required for payment (bank account number, account holder, bank name, bank address)?
Question 18: The Organization’s registration with local government?
Submit Application


Payload Collaboration means that the Rocket Project is not collaborating on the payload, but that the Bruin Spacecraft Group is building it by itself. Wait...
OK, we got it. Bruin Spacecraft Group is collaborating with the Rocket Project and the fruit of collaboration is a rocket with a payload from the Bruin Spacecraft Group. OK, so it's a Rocket Collaboration.
This way or the other this is the place where you're leaving the Rocket Project and are deciding to join the Bruin Spacecraft Group to build payload with them. We think they're great, otherwise we wouldn't be working with them, but we're still sorry that you're leaving us.
If you decided to change your mind, check out some of out other projects or IMAGINE ONE YOURSELF
Some technical payload information surely no one wants to read: The payload will consist of a full sensor package allowing to fully determine a 3D position and attitude of a rocket. The used sensors will likely include a pair of an accelerometer and a gyroscope, with an aid of a digital compass, to determined the attitude of the rocket in 3D rotation frame with a reference to a fixed point. The position will have to include 3D coordinates and so the use of a gps for plane positioning and a pressure sensor for altitude sensing appears to be reasonable. The payload must be equipped with a local storage device for data logging and means of transmitting acquired data to ground. Transmission presents a data rate bottleneck and will likely be between 10-100Hz depending on the choice of radio and trade-off between transmission robustness. Electrical characteristics should involve operation at a maximum of 5V to allow for the use of standardized power source (likely a double lithium-ion cell).


ICSREF: ICS Reverse Engineering Framework¶
_______________ ____ ____________
/ _/ ____/ ___// __ \/ ____/ ____/
/ // / \__ \/ /_/ / __/ / /_
_/ // /___ ___/ / _, _/ /___/ __/
/___/\____//____/_/ |_/_____/_/
by Tasos Keliris @koukouviou
Preview¶
Overview¶
ICSREF
is a modular framework that automates the reverse engineering process of CODESYS binaries compiled with the CODESYS v2 compiler. The framework can:
- Perform core analysis of arbitrary
PRG
programs. Core analysis includes: - Delimitation of binary blobs (i.e., functions/routines).
- Identification of calls to dynamic libraries.
- Identification of calls to static libraries (other locations in the same binary).
- Identification of how many and which physical I/Os the binary uses, provided a TRG file that contains the memory mappings of physical I/Os of the particular device the binary is compiled for.
- Perform core analysis of arbitrary
- Identify known library functions included statically in the binary:
- Using an opcode-based hash matching technique
- Using experimental signature-based techniques. This is at the moment only implemented for Proportional-Integral-Derivative (PID) CODESYS library functions.
- Extract arguments passed to static functions. This is at the moment only implemented for the PID_FIXCYCLE CODESYS library function, but it is trivial to extend this to other functions of interest.
- Argument extraction is powered by symbolic execution and
angr
- It can handle cases where the arguments are not impacted by I/O measurements (i.e., defined globally or passed directly)
- Argument extraction is powered by symbolic execution and
- Plot SVG graphs of the analyzed binary, including:
- Calls between static functions
- Calls to dynamic functions
- Hyperlinks to the disassembly listings of each function from the SVG
Graphs are powered by Graphviz. Here’s a neat example:
The framework supports an interactive mode, where all the processing modules are loaded. Users can further investigate and analyze their binaries by exploring the different options. The interactive environment also offers useful help docstrings.
(icsref) me@example:$ ./icsref.py
ICS Reverse Engineering Framework
_______________ ____ ____________
/ _/ ____/ ___// __ \/ ____/ ____/
/ // / \__ \/ /_/ / __/ / /_
_/ // /___ ___/ / _, _/ /___/ __/
/___/\____//____/_/ |_/_____/_/
author: Tasos Keliris (@koukouviou)
Type <help> if you need a nudge
reversing@icsref:$
reversing@icsref:$ help
Documented commands (type help <topic>):
========================================
__changepid changepid exp_pid_match history pyscript set
__replace_callname cleanup graphbuilder load quit shell
_relative_load cmdenvironment hashmatch pidargs run shortcuts
analyze edit help py save show
Documentation¶
The ICSREF
API is documented in a Read the Docs style. Once you download the repository you can traverse the docs directory and open index.html in your favorite browser.
Acknowledgements¶
ICSREF
, as all things good in life, is based on the shoulder of giants. The framework relies on symbolic execution using angr
for performing the most interesting analyses such as calculating offsets for static calls and the arguments to function calls. Disassembly listings for the graphing module are generated using the amazing r2
. The interactive mode of the tool is powered by the cmd2
python tool. Beautiful documentation is generated with Sphinx and the sphinx_rtd_theme.


Home
Blog
About
DBC
Resources
Unit 3 - June 23rd to July 13th
Week 7
SQLzoo
Designing Schemas
Modeling a Real-World Database
Intro to SQLite
GPS 3.1
Bonus - Using the SQLite Gem
Technical Blog - SQL vs. NoSQL
Cultural Blog - Affirmation and Stereotype Threat
Week 8
Nothing Yet
Week 9
Nothing Yet


GET https://motorbot.io/api/user/playlists HTTP/1.1
Authorization: Bearer {access_token}
Returns a list of playlists that this user has created or follows. These playlist objects will contain basic playlist information and short song objects.
| Header Field | Value |
| Authorization REQUIRED |
A valid access token from the MotorBot authorization system. See the OAuth 2.0 endpoint or the User Authorization Guide for further information. The access token must have been issued on behalf of the current user. |
| Query Parameter | Value |
| limit OPTIONAL |
Limit the number of returned playlist objects. Default is 20, Min: 1, Max: 50 |
| offset OPTIONAL |
Set the offset of were to start returning playlist objects, to be used in conjunction with the limit parameter. Default is 0 |
| filter OPTIONAL |
Set which values should be returned, for example to only return the values for keys name and description , the following query should be used: ?filter=name,description . The default behaviour will return all fields. |
On success, the HTTP status code in the response header will be set to 200
OK and the response body will contain a pagination object which will contain an array of simplified playlist objects in JSON format. Should an error occur, the header status code in the response header will be set to the corresponding error. If either your API key or the required access token for the requested user are not present a 401
Unauthorized response header will be returned.
HTTP/1.1 200 OK
Content-Type: application/json
| Key | Value Type | Value Description |
| id | string | The unique identifier that is assigned to the playlist |
| name | string | The name of the playlist |
| description | string | The description of the playlist |
| songs | an array of short song objects | A list containing short song objects |
| creator | string | The id of the user who created the playlist |
| create_date | integer | The timestamp of when the playlist was created by a user |
| followers | an array of strings | A list of id 's of the users that are currently following this playlist. This includes the current user. |
| artwork | strings | A URL for the cover art for the playlist. If none is supplied by the user, it will automatically generate one by using the first added track'S (that has a cover art) cover art |
| private | boolean | Has the owner made this playlist private? If set to false anyone can view this playlist and it can be returned as part of the browse endpoint |
| collaborative | boolean | Will be set to true if the owner has allowed other users to modify the playlist |
| position | integer | The order in which the user has ordered their playlists |
| owner | object | Contains basic owner information such as their id , username and discriminator |
{
"items": [
{
"id": "YAk87OrCDJWOexfI6vM5u0QDnUiy6M1o",
"name": "League Playlist",
"description": null,
"songs": [
{
"id": "57967c978aa4e45748542b98",
"date_added":<PHONE_NUMBER>021,
"play_count": 3,
"last_played":<PHONE_NUMBER>394
},
...
],
"creator": "95164972807487488",
"create_date":<PHONE_NUMBER>531,
"followers": [
"95164972807487488"
],
"artwork": "https://i.scdn.co/image/cbaae5a0a78584e707943c56035123195639a48b",
"private": true,
"collaborative": false,
"position": 1,
"owner": {
"username": "squírrel",
"discriminator": "2549",
"id": "95164972807487488"
}
},
...
],
"limit": 10,
"offset": 0,
"total": 16,
"next": "https://motorbot.io/api/user/playlists?limit=10&offset=10"
}
| Key | Value Type | Value Description |
| items | an array of objects | A list of the requested data |
| limit | integer | The limit set per the request (this is corrected if the supplied value exceeds the preset bounds) |
| offset | integer | An offset to be used for the items returned (this is corrected if the supplied value exceeds the preset bounds) |
| total | integer | The total number of items that can be requested |
| next | string | A URL to request the next page of results. This will be undefined should there not be anymore data available |
| prev | string | A URL to request the previous page of results. This will be undefined if the offset is below or equal to 0 |
| Key | Value Type | Value Description |
| id | string | The track id for the track |
| date_added | integer | The timestamp at which the track was added to the playlist |
| play_count | integer | The number of times the track has been played as part of the playlist |
| last_played | integer | The timestamp at which the track was last played as part of the playlist |
{
"id": "57967c978aa4e45748542b98",
"date_added":<PHONE_NUMBER>021,
"play_count": 3,
"last_played":<PHONE_NUMBER>394
}


| Photo rejected | 11:07am on 29 May 2017 |
| Joined processing queue | 9:42am on 23 May 2017 |
| Application received | 10:39am on 22 May 2017 |
| Application submitted | 10:38am on 22 May 2017 |
{{< layout}}
{{$pageTitle}}Track a passport application{{/pageTitle}}
{{$content}}
Your digital photo didn't meet the rules for UK passport photos. You need 2 printed photos
You need to take 2 printed passport photos to your collection appointment. You can get printed photos from a photo shop or a booth. There is a photo booth at the passport office.
You don't need to get anybody to sign the back of your photos.
Tuesday 30 May 2017 at 1:00pm
London HM Passport Office Globe House 89 Eccleston Square London SW1V 1PN
It takes longer to print your passport without a digital photo. You'll have to go back to the same passport office up to 4 working hours later to get your new passport.
 If you can't go to your collection appointment, contact us. Your new appointment details will be sent to you by email.
You must bring:
| Photo rejected | 11:07am on 29 May 2017 |
| Joined processing queue | 9:42am on 23 May 2017 |
| Application received | 10:39am on 22 May 2017 |
| Application submitted | 10:38am on 22 May 2017 |
Other statuses (these do not appear on the page)
{{/content}} {{/ layout}}


Tortuga.Chain.AuditRules Namespace
Classes
| Class | Description | |
|---|---|---|
| AuditRule |
Base class for all audit rules.
|
|
| AuditRuleCollection |
An immutable collection of rules.
|
|
| ColumnRule |
This is the base class for rules that affect a single column.
|
|
| DateTimeOffsetRule |
Applies the current DateTimeOffset value to the indicated column.
|
|
| DateTimeRule |
Applies the current DateTime value to the indicated column.
|
|
| RestrictColumn |
This rule is used to prevent users from reading or updating a column
|
|
| SoftDeleteRule |
If a column matching this rule is found, then soft deletes will be applied instead of hard deletes.
|
|
| UserDataRule |
This is a rule that overrides argument values with data on the user object.
|
|
| ValidateWithDataErrorInfo |
When this rule is in effect, objects that implement IDataErrorInfo will be checked.
|
|
| ValidateWithDataErrorInfo<(Of <(<'T>)>)> |
When this rule is in effect, objects of type T will be checked.
|
|
| ValidateWithNotifyDataErrorInfo |
When this rule is in effect, objects that implement INotifyDataErrorInfo will be checked.
|
|
| ValidateWithNotifyDataErrorInfo<(Of <(<'T>)>)> |
When this rule is in effect, objects of type T will be checked.
|
|
| ValidateWithValidatable |
When this rule is in effect, objects that implement IValidatable will be checked.
|
|
| ValidationRule |
Base class for validation style rules.
|
|
| ValueRule |
Applies the indicated value to the column, overriding any previously applied value.
|
Delegates
| Delegate | Description | |
|---|---|---|
| ColumnValueGenerator |
Rule Value Generator
|
|
| ExceptWhenPredicate |
This delegate is used for restricting access to a column
|
Enumerations
| Enumeration | Description | |
|---|---|---|
| OperationTypes |
Indicates the type of operation being performed.
|


"x" "1" "ZEIGER,E, ANDERSON,B, HAWORTH,S, LAWLOR,T, MORTELMANS,K AND SPECK,W,SALMONELLA MUTAGENICITY TESTS: III. RESULTS FROM THE TESTING OF 255 CHEMICALS,ENVIRON. MOL. MUTAGEN. 9(SUPPL.9):1-110, 1987"


Support for flex messaging.
This plugin can be deactivated if the project doesn't need flex messaging, usually a RemoteObject in Flex.
Flex doesn't use the basic packet system. When using a remote objct, first a CommandMessage is sent, expecting an AcknowledgeMessage in return. Then a RemotingMessage is sent, expecting an AcknowledgeMessage in return. This plugin adds support for this message flow.
In case of an error, an ErrorMessage is expected
Located in /Amfphp/Plugins/AmfphpFlexMessaging/AmfphpFlexMessaging.php (line 32)
if this is set, special error handling applies
the messageId of the last flex message. Used for error generation
the response uri of the last flex message. Used for error generation
constructor.
flex expects error messages formatted in a special way, using the ErrorMessage object.
handle the request message instead of letting the Amf Handler do it.
Documentation generated on Tue, 29 May 2012 23:41:59 +0200 by phpDocumentor 1.4.3


Let's talk about mental health
by Miriam HalpennyLocal mental health awareness company You Are Collective is bringing an open mic night focused on mental health to Spaces in the Kelowna Innovation Centre on Nov. 28.
You are Collective uses apparel and lived experiences to build awareness for mental health. In 2018 they raised more than $2,000 for services through events and sales.
The Spaces working hub is a new home for working professionals in downtown Kelowna, boosting the Okanagan tech community.
According to You Are Collective, young professionals and entrepreneurs in their twenties experience an overall decrease in their mental well-being while many of them cannot get the care they require because of financial or accessibility reasons.
Spaces and You Are Collective hopes by teaming up to bring more awareness to this issue while providing free resources they can establish a non-judgmental community where individuals feel safe sharing their stories.
You Are Collective hopes this will be the start of a series of collaborations with local businesses and venues to promote mental health.
Guests are encouraged to share their experiences through monologues, poems, songs or any other creative ways they desire.
Those not wanting to participate in the open mic can show their support in the audience and engage in meaningful conversations about mental health while also browsing the You Are Collective's new apparel collection.
The event will take place between 5 and 7 p.m. and local comedian Paige Mathison will also be attending to kick off the night with a performance at 5:30 p.m.
Free tickets are available here, and food and toy donations will also be accepted towards the Spaces holiday drive.


If this page is opened in Firefox, the test might have worked. If you don't have Firefox configured as your default browser, it definitely worked! You can close this.


As we all know, Rome was not built in a day. The same thing can be said about your goal.In order to succeed with your big goal, you need to break it down to checkpoints so it's easier to keep track of your progress. Let me help you create these.


编辑博客文章
Amount of Blog Posts
Show 3 Blog Posts
Show 6 Blog Posts
Show 9 Blog Posts
Organize Posts
By Date (Newest to Oldest)
By Favorites
By Repost
保存编辑


Mapbox Google Overlay
Introduction
Please see here
for the full documentation for renderTiles
and here
for the demo of basic tile rendering.
In this demo we show how basic tile rendering can be used in a google
map overlay
to render vector tiles on a google map. We are using a single vector source at a single zoom level.
Tiles for Brighton, UK were obtained free from openmaptiles.com
for use, here, in this open source project (see readme
for more details).
Google map with Mapbox vector tile overlay
Map


Danielle Cameron
Home
About
Projects
Contact
Testing Header
Testing Header
Testing Header
Button
Previous
Next
Header 1
This is testing text, This is testing text, This is texting test.
Button
Header 2
This is testing text, This is testing text, This is texting test.
Button
Header 3
This is testing text, This is testing text, This is texting test.
Button
I am going to be cool content


Project Performance Report
VOICE - Vote Online Interactive Civic Enablement
Project Manager: Charles Little
Date Prepared: 24 June 2017
Sponsor: Dr. Hayden Wimmer
Accomplishments for This Reporting Period:
- Started and completed functional requirements definition after review of voting registration requirements for the state of Georgia, and survey of similar requirements for other states.
- Started and completed technical requirements definition based on initial project proposal and desired end-state of the system.
- Generated work breakdown structure (WBS) based on technical and functional requirements and the needs of the project.
- Started and completed design of Data Model as iterative process. Initial data model was refined and developed to final model.
- Started and completed hardware procurement decision process. Reviewed cost, time, and complexities of using IaaS or SaaS offerings from Amazon Web Services and 1and1 hosting, versus construction/configuration of hardware/software at home office. Decision was taken for to perform construction/configuration option for maximum flexibility and availability of existing hardware components to be repurposed at no cost.
- Completed solution design based on technical and functional requirements.
- Installed LAMP stack using Ubuntu 16.04, Apache, MySQL, and PHP.
- Started development work:
- Created and tested DDL scripts to create schema entities and relations.
- Created and tested DML scripts to generate stored procedures according to design.
- Created and tested DML scripts to insert static configuration data into schema.
- Created and tested DML scripts for unit testing stored procedures.
- Started construction of HTML/PHP pages
Accomplishments Planned but not Completed This Reporting Period:
Root Cause of Variances
- Not applicable; plan is currently on schedule.
Planned Corrective or Preventive Action
- Review remaining tasks and durations in project plan and compare to delivery date. Adjust working hours per day to crash schedule, or review scope for task removal if plan may miss delivery date.
Planned Accomplishments for Next Reporting Period
- Complete development work by 30 June 2017.
- Start and complete Unit Testing by 7 July 2017.
- Complete final project documentation and delivery by 9 July 2017
New Risks Identified
- Developer has concerns that PHP development process may be slowed due to learning secure development practices for that platform. Will work to mitigate by crashing project plan by extending work day hours.
- Developer has concerns that Javascript development process may be slowed due to selection of Bootstrap framework, which utilizes JQuery. Will work to mitigate by trying to use provided functions of JQuery rather than developing from scratch.
Issues
- Hardware platform on initial build exhibited stability issues with X graphical user interface and NVidia Geforce drivers for Ubuntu. Resolved by reinstalling Ubuntu with headless server configuration and no X window interface.
- Final solution design centralizes business logic in stored procedures at data layer (initial design was to use logic in middleware layer, e.g. Java application server classes). Design change results in work breakdown structure shift to require a MySQL developer instead of Java developer.
- Unfamiliarity with MySQL development conventions slowed initial development. Resolved by crashing project plan by adding more hours to work day to compensate.
Comments
- Project is progressing well despite initial build issues and overall complexity. Expect project will conclude with scope successfully met


ST-20 Standard
Deck
Team
Blog
Developers
Careers
Blog
Developers
Careers
Toggle navigation
Whitepaper
Join Telegram Community
This browser does not support PDFs. Please download the PDF to view it:
Download PDF
Trillions of Dollars On The Blockchain Are Coming
Create Your Security Token


I Alone Level-up: Chapter 46
gulp
Even after all of his progress, Jinwoo could not help but be wary of what was to come . Still, his excitement in the anticipation of growth eclipsed his fear .
A moment ago, while he was looking for a suitable spot to start the quest, Jinwoo had used his phone to look through various video game wikis on classes .
[New skill . ]
[Growth benefits . ]
[Class-specific weapons . ]
[Class-only quests]
[ . Etc]
One thing was common across different video games: class advancement had many great benefits and rewards .
‘And it became possible for me at level forty . ’
Of course, not everything he found was positive . There were forum posts here and there complaining:
[I’m worried that I picked the wrong class . ]
[F***, if I knew, I would’ve picked a different class . ]
[I messed up on my build . I think I’m done with this game . ]
[Do I have to delete my character?]
. Well, they were still talking about video games .
Jinwoo wasn’t that worried about what class he would pick . He had solely used a dagger up until now, and even his skills were all related to an assassin class .
‘Dagger skills and something like ‘Stealth’ . ’
On top of that, his attributes were largely focused on strength and agility . Because of this, Jinwoo couldn’t think of obtaining a class other than Assassin . Thinking about the idea, Jinwoo summoned Casaka’s Poisoned Fang from his inventory .
shooo-
The dagger’s grip felt perfect in his hand . He nodded to himself .
‘Yep, this is what I’m used to . ’
With the dagger in hand, Jinwoo moved his gaze towards the quest screen .
‘Well then…’
He began planning for as many possibilities as possible . After taking a moment to prepare his heart, Jinwoo replied to the message .
| The Class Advancement Quest has arrived . . |
| Would you like to accept? (Y/N). |
‘Accept . ’
The moment he spoke the word in his mind, a messaged followed .
ring~
| You’ve accept the Class Advancement Quest . . |
| A Dungeon will be created for the quest . . |
‘A Dungeon… will be created?’

‘This is…?’
Jinwoo’s eyes were wide open . After accepting the quest, he had expected another information screen with the quest’s information would follow but not this…
A Gate had formed before his eyes .
‘To think that it would even make a Gate…’
The phenomenon in front of him was exactly the same as the Gates that appeared in the world . Only difference was that it was a bit smaller than the one he had seen . The System’s message continued, beckoning him in .
| Please enter the Dungeon through the Gate . . |
‘Let’s be calm . ’
Jinwoo calmed his heart .
Yes .
If he thought about it, whether he entered using a key or through a Gate, a Dungeon would be waiting on the other side . He was just surprised at the creation of an artificial Gate in front of his eyes . While he had entered many Gates before, he had never seen one being created . When he reached that line of thought, an idea appeared in his head,
‘Wait… Could other Hunters enter this Gate?’
Well, there was no time to experiment . There weren’t any other Hunters in the vicinity, nor did he know of any Hunters that would come running if he . called… .
Jinwoo erased Yoo Jinho’s face from his mind and shook his head .
‘What would I do if something went wrong . ’
The System’s message blinked as if reminding him,
ring~
| Please enter the Dungeon through the Gate . . |
Jinwoo was snapped back to reality by the electronic tone . He slapped his cheeks to focus .
‘Now’s not the time to get distracted . ’
Success here would mean obtaining a class and other rewards . He dreaded what failure would entail . He had to be focused .
“Whew-”
After a deep breath, Jinwoo held Casaka’s Poisoned Fang in a reverse grip and entered the Gate .
| You’ve entered the Dungeon . . |
‘Huh?’
To be honest, he had entered the Gate with a great anticipation . Contrary to his expectations, there was not much to be surprised at inside . It was just a simple cave Dungeon .
“It’s the same as always…?”
He had heard that high-level Dungeons would connect to different types of interiors and expected something similar but was disappointed . A special message did appear, however,
ring~
| In this place, usage of potions and the shop is restricted, and leveling up will not restore your status . . |
Jinwoo put away the dagger after confirming that there were no magic beasts around .
‘ . Looks like this won’t be easy . ’
Since this was a special Dungeon for class advancement, it seemed that there were a few conditions . The fact that he could not heal himself through potions or level-ups was particularly troubling .
‘That means even small damage will accumulate over time . ’
An injury would spell the end here . Without means of recovery, he would have to be cautious of every move he made .
‘I really, really have to be focused . ’
Jinwoo closed the message box . As he always did, he checked the exit of the Dungeon .
| Until your class advancement is complete, you cannot leave . . |
The moment he placed his hand on the Gate, that message appeared . He put his back into it, but the exit did not budge .
“ . ”
He retracted his hand .
‘So the path to retreat is blocked . ’
He had yet to figure out the difficulty of the Dungeon . Additionally, he could not recover his health here . Finally, there was no leaving until he was finished .
The risk this time was very high . Even the bravest of Hunters would hesitate before entering with such conditions .
‘But a high risk doesn’t necessary mean that it’s bad . ’
High risk equaled high rewards . He had learned as much from his experiences . If all these conditions made the quest harder, perhaps an equally great reward waited at the end .
Well, there was only one way to find out .
‘Time to go . ’
Jinwoo began to walk deeper into the cave . He could not see the end of the tunnel and at the same time did not see or sense any magic beasts .
‘Wait, since this is the System’s territory, should it be “monsters” and not “magic beasts”?’
Eh, in the end, they were both dangerous beings .
There was one difference in this place compared to the normal cave Dungeons . The cave’s walls were decorated with torches, placed evenly across the path .
‘Torches instead of glowing rocks . Hmm . ’
The torches were not an effective source of light . Even if there were many of them, it was not enough to completely illuminate the dark tunnel . As such, the flickering light produced many shadows here and there . The combination of the shadows and the silence produced a very dreary atmosphere compared to a normal Dungeon .
‘Well, I don’t have any problems seeing . ’
What bothered him was the impact it had on his mood .
Jinwoo went over and removed the closest torch from the wall . The way forward became slightly brighter .
‘This is better . ’
Jinwoo smiled in satisfaction . He took a brief look behind him, then started forward again, torch in hand .
How long did he walk in this straight path?
After some time, he finally came across a turn . Around the corner, he felt several presences .
‘Finally . ’
He carefully dropped the torch on the ground .
shooo-
In the place of the torch, his right hand now held a dagger . He briefly considered using ‘Stealth’ to gain a preemptive advantage but decided to conserve his mana; potions could not be used after all . If he carelessly spent his mana, he might not be able to use a skill in a pivotal moment .
‘ . They’re coming this way . ’
Jinwoo hugged the wall with his back, then waited for the enemies to come around the corner .
clang, clang
A metallic sound rang while they were walking towards him . The sound came closer and closer .
clang, clang
At the rambunctious sound, Jinwoo wondered,
‘Are they holding some sort of a chain weapon?’
He was curious but did not worry . He would find out in a moment .
‘5, 4, 3 . ’
He held his dagger in a reverse grip and held his breath . He did not want the sound of his breathing to be heard .
‘2, 1 . ’
clang, clang .
Finally, their shadows appeared around the corner .
‘ . 0 . ’
As Jinwoo finished counting down, the thing showed itself . Jinwoo immediately went for its neck .
Clang!
The sound of metal striking metal rang loudly . His dagger did not pierce the target .
‘Armor?’
Jinwoo was surprised . Confirming the identity of his enemy, he quickly backed way .
“Human?”
It was a knight equipped with a full set of armor . Even its face was covered by a helmet . Just in case, Jinwoo called toward it,
“Oy!”
The knight reacted by charging toward Jinwoo .
clang, clang, clang!
The knight vigorously used his shoulders to try and tackle Jinwoo, but the Hunter easily twisted his body to dodge the attack . The knight could not stop its momentum and ran forward for a bit before stopping .
‘Not human?’
After expanding his sense a bit more, Jinwoo was sure . The knight did not have a heartbeat . It was a magic beast, or rather, a monster that he had never seen before . To think that there’d be a monster covered from head to toe in armor .
‘So…’
It was almost as if he was fighting another human .
shiing!
The knight turned around and unsheathe the sword at its side . As Jinwoo thought, it had no intention of letting him leave alive . Confirming each other’s hostility, Jinwoo’s eyes became a level sharper .
‘Sprint!’
| Your movement speed is increased by 40% . . |
The first to strike would be the victor!
Before the knight could reach him, Jinwoo entered its range first .
slash!
The Hunter dodged its panicked swing and stabbed its armor here and there .
Clang! Clang!
But he could not do any damage .
‘The armor’s too thick . ’
Not only that, it could almost be described as slippery . His dagger helplessly slid off and was deflected everytime he struck the armor . The knight swung its sword in a horizontal line .
slash!
Jinwoo lowered his head to dodge . The blade of the sword passed just inches above his head . As its attack was powerful, the opening created after missing was equally huge . Jinwoo did not miss the opportunity . Still in melee range, Jinwoo focused all of his power into his dagger .
‘Vital Stab!’
Crack!
The dagger pierced through the armor .
‘Did it work?’
However, as if it didn’t do any damage, the knight ignored the dagger sticking out of its side and brought down the sword in a vertical line .
Slash!
Jinwoo threw his body backwards .
Clang!
Sparks flew from the ground the sword struck .
“ . ”
Jinwoo straightened himself after taking few steps back . Casaka’s Poisoned Fang was still stuck to the knight’s side .
Che .
Jinwoo clicked his tongue .
‘He’s not exactly strong . ’
It was true . Because of its armor, the knight was slow . Not only that, its attack pattern was rather simple . The primary obstacle was its tough resistance to bladed weapons .
Jinwoo rolled up his sleeves .
‘If it’s a tough armor a blade can’t get through, I’ve already got some experience . ’
His maintained his composure . He recalled the scales of a boss that effortlessly broke a magic power infused steel sword . He remembered how he took down that giant snake .
‘Compared to Casaka, this bastard’s nothing…’
Thinking of the first boss he ever won against, Jinwoo smiled in nostalgia .
clang, clang, clang!
The knight, confident in its armor, charged at Jinwoo once more .
‘As expected, it’s not that smart . ’
Jinwoo easily dodged the knight’s shoulder tackle and maneuvered behind its back and put it in a headlock .
craaack!
Of course, its neck was also armored; it probably would not be choked just by this .
craaaaaack!
Jinwoo’s arms flexed and showed their veins . He was not trying to choke the knight . He clenched his teeth, and his eyes flared open .
CRACK!. .
With a sickening sound, the helmet was removed . This was the power of the strength stat that had reached above 100 . Having lost its head, the knight knelt to the ground .
Clang!
| You’ve defeated the Knight . . |
The welcoming sight of a message signaled the end of the fight . While there was a light indicating a drop coming from the knight’s corpse, Jinwoo was focused on something else .
‘What the, it’s empty?’
There was no head in the helmet he was holding . He also looked inside the kneeling armor but found it just as empty .
‘Then was I fighting with a moving armor?’
As he reached that conclusion, two more knights appeared around the corner . It appeared that they had finally realized that there was a fight going on .
clang, clang .
Having discovered Jinwoo, the two knights took out their swords in unison .
shiing-
shiing-
Jinwoo threw aside the helmet and stretched his neck and shoulders . He knew the method of defeating them now .
‘Shall we begin?’
clang, clang, clang, clang!
Jinwoo smiled at the approaching knights .
The quest was going smoothly so far .


HIV type 1 protease activation of NF-kappa B within T lymphoid cells.
Abstract
NF-kappa B is a nuclear protein of the rel oncogene family capable of enhancing transcription of several cellular genes, including IL-2 and the IL-2 receptor, and viral genes transcribed from the HIV-1 LTR. It has been reported that HIV-1 protease may cleave the NF-kappa B precursor to its active form in vitro. In this study the effects of HIV protease on NF-kappa B precursor activation were examined in Jurkat T cells by introducing a protease expression vector into the cells. Increased NF-kappa B activity was observed and this increased activity was blocked by a specific inhibitor of the viral protease. Viral transcription, as measured using LTR -CAT assays, was only slightly enhanced in the HIV-protease expressing cells, while secretion of IL-2 and expression of the IL-2 receptor were not affected. The limited activation of NF-kappa B by HIV protease appears unlikely to have a significant effect on virus expression or T cell function.


13 Ordered Logistic Regression - Ex: Spaking
library(tidyverse)
library(haven) # read in SPSS dataset
library(furniture) # nice table1() descriptives
library(stargazer) # display nice tables: summary & regression
library(texreg) # Convert Regression Output to LaTeX or HTML Tables
library(psych) # contains some useful functions, like headTail
library(car) # Companion to Applied Regression
library(sjPlot) # Quick plots and tables for models
library(car) # Companion to Applied Regression (a text book - includes datasets)
library(MASS) # Support Functions and Datasets
library(nnet) # Multinomial Log-Linear Models
library(pscl) # Political Science Computational Laboratory (ZIP)
13.1 Background
This dataset comes from John Hoffman’s textbook: Regression Models for Categorical, Count, and Related Variables: An Applied Approach (2004) Amazon link, 2014 edition
Chapter 4: Ordered Logistic and Probit Regression Models
Dataset: The following example uses the SPSS data set gss.sav
. The dependent variable of interest is labeled spanking
.
" The pertinent question (
spanking
) asks “Do you strongly agree, agree, disagree, or strongly disagree that it is sometimes necessary to discipline a child with a good, hard spanking?” The possible answers are coded as1
= strongly agree,2
= agree,3
= disagree, and4
= strongly disagree. A common hypothesis is that support for corporal punishment of children decreases at higher levels of education."
13.1.1 Raw Dataset
<- haven::read_spss("https://raw.githubusercontent.com/CEHS-research/data/master/Hoffmann_datasets/gss.sav") %>%
data_gss ::as_factor()
haven
%>%
data_gss ::select(spanking, female, nonwhite, educate, income) %>%
dplyr::filter(!is.na(spanking)) %>% # about 1/3 of participants are missing this
dplyrhead()
# A tibble: 6 x 5
spanking female nonwhite educate income
<fct> <fct> <fct> <dbl> <dbl>
1 agree male white 16 12
2 agree female white 11 2
3 disagree male white 15 12
4 disagree male white 14 NA
5 agree female non-white 16 12
6 agree male white 12 NA
13.1.2 Wrangle Data
<- data_gss %>%
data_gss_model ::mutate(spankingN = as.numeric(spanking)) %>% # numeric version: 1, 2, 3, 4
dplyr::mutate(polviewsN = as.numeric(polviews)) %>%
dplyr::filter(complete.cases(educate, spanking)) # only include complete cases dplyr
13.2 Exploratory Data Analysis
13.2.1 Entire Sample
%>%
data_gss ::table1(spanking,
furniturena.rm = FALSE,
output = "markdown",
caption = "Hoffmann's Example 4.1 Summary of the Spanking Variable")
| Mean/Count (SD/%) | |
|---|---|
| n = 2903 | |
| spanking | |
| strongly agree | 512 (17.6%) |
| agree | 890 (30.7%) |
| disagree | 357 (12.3%) |
| strongly disagree | 164 (5.6%) |
| NA | 980 (33.8%) |
%>%
data_gss ggplot(aes(spanking)) +
geom_bar()
13.2.2 By Education
%>%
data_gss ::group_by(forcats::fct_explicit_na(spanking)) %>%
dplyr::table1("Educations, years" = educate,
furniture"Education, factor" = factor(educate),
na.rm = FALSE,
digits = 2,
output = "markdown")
| strongly agree | agree | disagree | strongly disagree | (Missing) | |
|---|---|---|---|---|---|
| n = 512 | n = 890 | n = 357 | n = 164 | n = 980 | |
| Educations, years | |||||
| 12.64 (2.96) | 13.40 (2.84) | 14.00 (2.74) | 14.24 (3.00) | 13.32 (2.95) | |
| Education, factor | |||||
| 0 | 0 (0%) | 2 (0.2%) | 0 (0%) | 0 (0%) | 2 (0.2%) |
| 3 | 5 (1%) | 0 (0%) | 0 (0%) | 0 (0%) | 3 (0.3%) |
| 4 | 1 (0.2%) | 0 (0%) | 0 (0%) | 1 (0.6%) | 4 (0.4%) |
| 5 | 4 (0.8%) | 5 (0.6%) | 0 (0%) | 1 (0.6%) | 3 (0.3%) |
| 6 | 5 (1%) | 5 (0.6%) | 1 (0.3%) | 0 (0%) | 3 (0.3%) |
| 7 | 7 (1.4%) | 8 (0.9%) | 0 (0%) | 1 (0.6%) | 7 (0.7%) |
| 8 | 25 (4.9%) | 15 (1.7%) | 5 (1.4%) | 2 (1.2%) | 33 (3.4%) |
| 9 | 15 (2.9%) | 20 (2.2%) | 7 (2%) | 4 (2.4%) | 23 (2.3%) |
| 10 | 27 (5.3%) | 44 (4.9%) | 11 (3.1%) | 4 (2.4%) | 35 (3.6%) |
| 11 | 39 (7.6%) | 42 (4.7%) | 16 (4.5%) | 5 (3%) | 53 (5.4%) |
| 12 | 152 (29.7%) | 270 (30.3%) | 97 (27.2%) | 33 (20.1%) | 297 (30.3%) |
| 13 | 56 (10.9%) | 90 (10.1%) | 41 (11.5%) | 19 (11.6%) | 90 (9.2%) |
| 14 | 56 (10.9%) | 111 (12.5%) | 41 (11.5%) | 19 (11.6%) | 112 (11.4%) |
| 15 | 19 (3.7%) | 47 (5.3%) | 14 (3.9%) | 14 (8.5%) | 59 (6%) |
| 16 | 59 (11.5%) | 105 (11.8%) | 68 (19%) | 31 (18.9%) | 129 (13.2%) |
| 17 | 13 (2.5%) | 45 (5.1%) | 14 (3.9%) | 6 (3.7%) | 42 (4.3%) |
| 18 | 17 (3.3%) | 43 (4.8%) | 15 (4.2%) | 11 (6.7%) | 39 (4%) |
| 19 | 3 (0.6%) | 15 (1.7%) | 8 (2.2%) | 2 (1.2%) | 13 (1.3%) |
| 20 | 8 (1.6%) | 20 (2.2%) | 18 (5%) | 11 (6.7%) | 29 (3%) |
| NA | 1 (0.2%) | 3 (0.3%) | 1 (0.3%) | 0 (0%) | 4 (0.4%) |
13.2.3 Spanking by Sex
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::select(female, spanking) %>%
dplyrtable() %>%
addmargins()
spanking
female strongly agree agree disagree strongly disagree Sum
male 243 388 156 56 843
female 269 502<PHONE_NUMBER>
Sum 512 890<PHONE_NUMBER>
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::tableX(female, spanking,
furnituretype = "count")
spanking
female strongly agree agree disagree strongly disagree Total
male 243 388 156 56 843
female 269 502<PHONE_NUMBER>
Total 512 890<PHONE_NUMBER>
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::tableX(female, spanking,
furnituretype = "row_perc")
spanking
female strongly agree agree disagree strongly disagree Total
male 28.83 46.03 18.51 6.64 100.00
female 24.91 46.48 18.61 10.00 100.00
All 26.63 46.28 18.56 8.53 100.00
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::tableX(female, spanking,
furnituretype = "col_perc")
spanking
female strongly agree agree disagree strongly disagree All
male 47.46 43.60 43.70 34.15 43.84
female 52.54 56.40 56.30 65.85 56.16
Total 100.00 100.00 100.00 100.00 100.00
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::tableX(female, spanking,
furnituretype = "cell_perc")
spanking
female strongly agree agree disagree strongly disagree Total
male 12.64 20.18 8.11 2.91 43.84
female 13.99 26.11 10.45 5.62 56.16
Total 26.63 46.28 18.56 8.53 100.00
%>%
data_gss ::filter(complete.cases(female, spanking)) %>%
dplyr::group_by(spanking) %>%
dplyr::table1(female) furniture
--------------------------------------------------------------------
spanking
strongly agree agree disagree strongly disagree
n = 512 n = 890 n = 357 n = 164
female
male 243 (47.5%) 388 (43.6%) 156 (43.7%) 56 (34.1%)
female 269 (52.5%) 502 (56.4%) 201 (56.3%) 108 (65.9%)
--------------------------------------------------------------------
13.3 Linear Regression
Linear regression is often ill-suited to fitting a likert rating, such as agreement.
13.3.1 Visualization
%>%
data_gss_model ggplot(aes(x = educate,
y = spankingN)) +
geom_count() + # point size relative to over-plotting
geom_smooth(method = "lm") + # add linear regression line (OLS)
theme_bw() +
labs(x = "Years of Formal Education",
y = "Spanking")
13.3.2 Fit the Model
<- lm(spankingN ~ educate,
fit_lm data = data_gss_model)
summary(fit_lm)
Call:
lm(formula = spankingN ~ educate, data = data_gss_model)
Residuals:
Min 1Q Median 3Q Max
-1.44768 -0.79947 -0.06955 0.66036 2.41660
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.367326 0.093670 14.597 < 2e-16 ***
educate 0.054018 0.006839 7.898 4.73e-15 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8729 on 1916 degrees of freedom
Multiple R-squared: 0.03153, Adjusted R-squared: 0.03103
F-statistic: 62.38 on 1 and 1916 DF, p-value: 4.73e-15
anova(fit_lm)
# A tibble: 2 x 5
Df `Sum Sq` `Mean Sq` `F value` `Pr(>F)`
<int> <dbl> <dbl> <dbl> <dbl>
1 1 47.5 47.5 62.4 4.73e-15
2 1916 1460. 0.762 NA NA
13.3.3 Tabulate Parameters
::knitreg(fit_lm,
texregcustom.model.name = "Linear Regression",
caption = "Hoffmann's Example 4.2",
caption.above = TRUE,
single.row = TRUE,
digits = 4)
| Linear Regression | |
|---|---|
| (Intercept) | 1.3673 (0.0937)*** |
| educate | 0.0540 (0.0068)*** |
| R2 | 0.0315 |
| Adj. R2 | 0.0310 |
| Num. obs. | 1918 |
| p < 0.001; p < 0.01; p < 0.05 |
13.3.4 Model Fit and Variance Explained
::performance(fit_lm) performance
# A tibble: 1 x 6
AIC BIC R2 R2_adjusted RMSE Sigma
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 4926. 4942. 0.0315 0.0310 0.872 0.873
::r2(fit_lm) performance
# R2 for Linear Regression
R2: 0.032
adj. R2: 0.031
13.3.5 Residual Diagnostics
::plot_model(fit_lm, type = "diag") sjPlot
[[1]]
[[2]]
[[3]]
13.4 Ordered Logistic Regression
%>%
data_gss_model ::group_by(forcats::fct_explicit_na(spanking)) %>%
dplyr::table1("Sex" = female,
furniturecaption = "Hoffmann's Example 4.3 Crosstabulate DV with Sex",
na.rm = FALSE,
digits = 2,
total = TRUE,
output = "markdown")
| Total | strongly agree | agree | disagree | strongly disagree | |
|---|---|---|---|---|---|
| n = 1918 | n = 511 | n = 887 | n = 356 | n = 164 | |
| Sex | |||||
| male | 841 (43.8%) | 243 (47.6%) | 387 (43.6%) | 155 (43.5%) | 56 (34.1%) |
| female | 1077 (56.2%) | 268 (52.4%) | 500 (56.4%) | 201 (56.5%) | 108 (65.9%) |
| NA | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) |
%>%
data_gss_model ::tableX(female, spanking) furniture
spanking
female strongly agree agree disagree strongly disagree Total
male 243 387 155 56 841
female 268 500<PHONE_NUMBER>
Total 511 887<PHONE_NUMBER>
13.5 Proportional-odds (ordinal) Logistic Regression
This type of logisit regression model forces the predictors to have similar relationship with the outcome (slopes), but different means (intercepts). This is called the proportional odds assumption.
13.5.1 Fit Model 1: Sex
Use polr()
function in the base \(R\) MASS
package. While outcome variable (dependent variable, “Y”) may be a regular factor
, it is preferable to specify it as an ordered
factor.
<- MASS::polr(spanking ~ female,
fit_polr_1 data = data_gss_model)
summary(fit_polr_1)
Call:
MASS::polr(formula = spanking ~ female, data = data_gss_model)
Coefficients:
Value Std. Error t value
femalefemale 0.2116 0.08532 2.48
Intercepts:
Value Std. Error t value
strongly agree|agree -0.8967 0.0694 -12.9114
agree|disagree 1.1094 0.0711 15.6078
disagree|strongly disagree 2.4922 0.0958 26.0026
Residual Deviance: 4719.394
AIC: 4727.394
13.5.2 Extract Parameters
<IP_ADDRESS> Logit Scale
$zeta fit_polr_1
strongly agree|agree agree|disagree
-0.8966862 1.1093754
disagree|strongly disagree
2.4921855
%>% coef() fit_polr_1
femalefemale
0.2116244
%>% confint() fit_polr_1
2.5 % 97.5 %
0.04451894 0.37901780
<IP_ADDRESS> Odds-Ratio Scale
$zeta %>% exp() fit_polr_1
strongly agree|agree agree|disagree
0.4079192 3.0324638
disagree|strongly disagree
12.0876653
%>% coef() %>% exp() fit_polr_1
femalefemale
1.235684
%>% confint() %>% exp() fit_polr_1
2.5 % 97.5 %
1.045525 1.460849
<IP_ADDRESS> Predicted Probabilities
::allEffects(fit_polr_1) effects
model: spanking ~ female
female effect (probability) for strongly agree
female
male female
0.289732 0.248186
female effect (probability) for agree
female
male female
0.4622807 0.4623011
female effect (probability) for disagree
female
male female
0.1715795 0.1967672
female effect (probability) for strongly disagree
female
male female
0.07640782 0.09274572
13.5.3 Tabulate parameters
::knitreg(fit_polr_1,
texregcustom.model.name = c("b (SE)"),
custom.coef.map = list("femalefemale" = "Female vs. Male",
"strongly agree|agree" = "strongly agree|agree",
"agree|disagree" = "agree|disagree",
"disagree|strongly disagree" = "disagree|strongly disagree"),
groups = list("Predictors" = 1,
"Cut Values (i.e. threasholds)" = 2:4),
caption = "Hoffmann's Example 4.4 Ordered Logistic Regression",
caption.above = TRUE,
single.row = TRUE,
digits = 4)
| b (SE) | |
|---|---|
| Predictors | |
| Female vs. Male | 0.2116 (0.0853)* |
| Cut Values (i.e. threasholds) | |
| strongly agree|agree | -0.8967 (0.0694)*** |
| agree|disagree | 1.1094 (0.0711)*** |
| disagree|strongly disagree | 2.4922 (0.0958)*** |
| AIC | 4727.3944 |
| BIC | 4749.6306 |
| Log Likelihood | -2359.6972 |
| Deviance | 4719.3944 |
| Num. obs. | 1918 |
| p < 0.001; p < 0.01; p < 0.05 |
13.5.4 Predicted Probabilities
::ggeffect(model = fit_polr_1,
ggeffectsterms = c("female"))
# A tibble: 8 x 7
x response.level predicted std.error conf.low conf.high group
<fct> <chr> <dbl> <dbl> <dbl> <dbl> <fct>
1 male strongly.agree 0.290 0.0694 0.263 0.319 1
2 female strongly.agree 0.248 0.0647 0.225 0.273 1
3 male agree 0.462 0.0460 0.440 0.485 1
4 female agree 0.462 0.0459 0.440 0.485 1
5 male disagree 0.172 0.0708 0.153 0.192 1
6 female disagree 0.197 0.0653 0.177 0.218 1
7 male strongly.disagree 0.0764 0.0958 0.0642 0.0908 1
8 female strongly.disagree 0.0927 0.0889 0.0791 0.108 1
::ggeffect(model = fit_polr_1,
ggeffectsterms = c("female")) %>%
::filter(x == "female") dplyr
# A tibble: 4 x 7
x response.level predicted std.error conf.low conf.high group
<fct> <chr> <dbl> <dbl> <dbl> <dbl> <fct>
1 female strongly.agree 0.248 0.0647 0.225 0.273 1
2 female agree 0.462 0.0459 0.440 0.485 1
3 female disagree 0.197 0.0653 0.177 0.218 1
4 female strongly.disagree 0.0927 0.0889 0.0791 0.108 1
13.5.5 Plot Predicted Probabilities
::ggeffect(model = fit_polr_1,
ggeffectsterms = c("female")) %>% # x-axis
data.frame() %>%
ggplot(aes(x = x,
y = predicted,
group = response.level,
color = response.level)) +
geom_errorbar(aes(ymin = conf.low,
ymax = conf.high),
width = .25) +
geom_point(size = 4) +
geom_line(aes(linetype = response.level))
::ggeffect(model = fit_polr_1,
ggeffectsterms = c("female")) %>% # x-axis
data.frame() %>%
::mutate(response.level = response.level %>%
dplyr::fct_reorder(predicted) %>%
forcats::fct_rev()) %>%
forcatsggplot(aes(x = x,
y = predicted,
group = response.level,
color = response.level)) +
geom_errorbar(aes(ymin = conf.low,
ymax = conf.high),
width = .25) +
geom_point(size = 4) +
geom_line(aes(linetype = response.level)) +
theme_bw() +
labs(x = NULL,
y = "Predicted Probability",
color = "Spanking:",
shape = "Spanking:",
linetype = "Spanking:") +
theme(legend.key.width = unit(2, "cm")) +
scale_linetype_manual(values = c("solid", "longdash", "dotdash", "dotted")) +
scale_shape_manual(values = c(0, 1, 2, 8))
13.5.6 Model Fit and Variance Explained
<- MASS::polr(spanking ~ 1,
fit_polr_0 data = data_gss_model)
anova(fit_polr_1, fit_polr_0)
# A tibble: 2 x 7
Model `Resid. df` `Resid. Dev` Test ` Df` `LR stat.` `Pr(Chi)`
<chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
1 1 1915 4726. "" NA NA NA
2 female 1914 4719. "1 vs 2" 1 6.16 0.0130
::performance(fit_polr_1) performance
Can't calculate log-loss.
Can't calculate proper scoring rules for ordinal, multinomial or cumulative link models.
# A tibble: 1 x 5
AIC BIC R2_Nagelkerke RMSE Sigma
<dbl> <dbl> <dbl> <dbl> <dbl>
1 4727. 4750. 0.00351 2.05 1.57
::r2(fit_polr_1) performance
Nagelkerke's R2: 0.004
13.5.7 Assumptions
<IP_ADDRESS> Proportional Odds: Brant Test
The poTest
function implements tests proposed by Brant (1990) for proportional odds for logistic models fit by the polr()
function in the MASS package.
# Hoffmann's Examle 4.5 (continued...)
::poTest(fit_polr_1) car
Tests for Proportional Odds
MASS::polr(formula = spanking ~ female, data = data_gss_model)
b[polr] b[>strongly agree] b[>agree] b[>disagree] Chisquare df
Overall 3.01 2
femalefemale 0.212 0.204 0.183 0.446 3.01 2
Pr(>Chisq)
Overall 0.22
femalefemale 0.22
A significant test statistics provides evidence that the parallel regression assumption has been violated!
13.5.8 Fit Model 2: Sex + Covars
<- MASS::polr(spanking ~ female + educate + polviewsN,
fit_polr_2 data = data_gss_model)
summary(fit_polr_2)
Call:
MASS::polr(formula = spanking ~ female + educate + polviewsN,
data = data_gss_model)
Coefficients:
Value Std. Error t value
femalefemale 0.2532 0.08825 2.869
educate 0.1153 0.01564 7.374
polviewsN -0.2215 0.03248 -6.818
Intercepts:
Value Std. Error t value
strongly agree|agree -0.2977 0.2671 -1.1146
agree|disagree 1.7845 0.2706 6.5935
disagree|strongly disagree 3.1926 0.2793 11.4312
Residual Deviance: 4396.504
AIC: 4408.504
(97 observations deleted due to missingness)
13.5.9 Extract Parameters
<IP_ADDRESS> Logit Scale
$zeta fit_polr_2
strongly agree|agree agree|disagree
-0.2976843 1.7844863
disagree|strongly disagree
3.1926342
%>% coef() fit_polr_2
femalefemale educate polviewsN
0.2532132 0.1152980 -0.2214577
%>% confint() fit_polr_2
2.5 % 97.5 %
femalefemale 0.08039420 0.4263963
educate 0.08472724 0.1460403
polviewsN -0.28526298 -0.1579046
<IP_ADDRESS> Odds-Ratio Scale
$zeta %>% exp() fit_polr_2
strongly agree|agree agree|disagree
0.7425358 5.9565193
disagree|strongly disagree
24.3524926
%>% coef() %>% exp() fit_polr_2
femalefemale educate polviewsN
1.2881578 1.1222079 0.8013498
%>% confint() %>% exp() fit_polr_2
2.5 % 97.5 %
femalefemale 1.0837142 1.5317277
educate 1.0884202 1.1572429
polviewsN 0.7518165 0.8539312
13.5.10 Tabulate parameters
::knitreg(fit_polr_2,
texregcustom.model.name = c("b (SE)"),
custom.coef.map = list("femalefemale" = "Female vs. Male",
"educate" = "Years of Education",
"polviewsN" = "Level of Polytical Views",
"strongly agree|agree" = "strongly agree|agree",
"agree|disagree" = "agree|disagree",
"disagree|strongly disagree" = "disagree|strongly disagree"),
groups = list("Predictors" = 1:3,
"Cut Values" = 4:6),
caption = "Hoffmann's Example 4.7 Ordered Logistic Regression",
caption.above = TRUE,
single.row = TRUE,
digits = 4)
| b (SE) | |
|---|---|
| Predictors | |
| Female vs. Male | 0.2532 (0.0883)** |
| Years of Education | 0.1153 (0.0156)*** |
| Level of Polytical Views | -0.2215 (0.0325)*** |
| Cut Values | |
| strongly agree|agree | -0.2977 (0.2671) |
| agree|disagree | 1.7845 (0.2706)*** |
| disagree|strongly disagree | 3.1926 (0.2793)*** |
| AIC | 4408.5038 |
| BIC | 4441.5466 |
| Log Likelihood | -2198.2519 |
| Deviance | 4396.5038 |
| Num. obs. | 1821 |
| p < 0.001; p < 0.01; p < 0.05 |
13.5.11 Predicted Probabilities
The
ggeffects
package computes estimated marginal means (predicted values) for the response, at the margin of specific values or levels from certain model terms, i.e. it generates predictions by a model by holding the non-focal variables constant and varying the focal variable(s).
ggpredict()
usespredict()
for generating predictions- factors: uses the reference level
ggeffect()
computes marginal effects by internally callingeffects::Effect()
- factors: compute a kind of “average” value, which represents the proportions of each factor’s category
ggemmeans()
usesemmeans::emmeans()
- factors: compute a kind of “average” value, which represents the proportions of each factor’s category
Use condition
to set a specific level for factors in ggemmeans()
, so factors are not averaged over their categories, but held constant at a given level.
ggeffects::ggpredict()
Adjusted for: * educate = 13.51 The grand mean value * polviewsN = 4.17 The grand mean value
## Hoffmann's Example 4.8 (continues...approximated)
::ggpredict(model = fit_polr_2,
ggeffectsterms = c("female"))
# A tibble: 8 x 7
x predicted std.error conf.low conf.high response.level group
<fct> <dbl> <dbl> <dbl> <dbl> <chr> <fct>
1 male 0.283 0.253 0.193 0.393 strongly agree 1
2 male 0.477 0.253 0.357 0.600 agree 1
3 male 0.169 0.253 0.110 0.250 disagree 1
4 male 0.0718 0.253 0.0450 0.113 strongly disagree 1
5 female 0.234 0.276 0.151 0.344 strongly agree 1
6 female 0.476 0.276 0.346 0.610 agree 1
7 female 0.199 0.276 0.126 0.299 disagree 1
8 female 0.0906 0.276 0.0549 0.146 strongly disagree 1
::ggpredict(model = fit_polr_2,
ggeffectsterms = c("female")) %>%
data.frame()
# A tibble: 8 x 7
x predicted std.error conf.low conf.high response.level group
<fct> <dbl> <dbl> <dbl> <dbl> <chr> <fct>
1 male 0.283 0.253 0.193 0.393 strongly agree 1
2 male 0.477 0.253 0.357 0.600 agree 1
3 male 0.169 0.253 0.110 0.250 disagree 1
4 male 0.0718 0.253 0.0450 0.113 strongly disagree 1
5 female 0.234 0.276 0.151 0.344 strongly agree 1
6 female 0.476 0.276 0.346 0.610 agree 1
7 female 0.199 0.276 0.126 0.299 disagree 1
8 female 0.0906 0.276 0.0549 0.146 strongly disagree 1
13.6 Hoffmann’s Example 4.8 (continues…approximated)
ggeffects::ggpredict()
Adjusted for: * female = male The reference category * polviewsN = 4.17 The grand mean value
::ggpredict(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]", # 1st = x
"female")) %>% # 2nd = group
data.frame() %>%
::filter(group == "male") dplyr
# A tibble: 8 x 7
x predicted std.error conf.low conf.high response.level group
<dbl> <dbl> <dbl> <dbl> <dbl> <chr> <fct>
1 10 0.371 0.209 0.282 0.471 strongly agree male
2 10 0.454 0.209 0.356 0.556 agree male
3 10 0.125 0.209 0.0868 0.177 disagree male
4 10 0.0491 0.209 0.0331 0.0721 strongly disagree male
5 16 0.228 0.287 0.144 0.342 strongly agree male
6 16 0.475 0.287 0.340 0.614 agree male
7 16 0.203 0.287 0.127 0.309 disagree male
8 16 0.0935 0.287 0.0555 0.153 strongly disagree male
ggeffects::ggeffect()
Adjusted for: * female computed a kind of “average” value, which represents the proportions of male/female * polviewsN = 4.17 The grand mean value
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]")) %>%
data.frame()
# A tibble: 8 x 7
x response.level predicted std.error conf.low conf.high group
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct>
1 10 strongly.agree 0.339 0.0744 0.307 0.372 1
2 16 strongly.agree 0.204 0.0692 0.183 0.227 1
3 10 agree 0.465 0.0498 0.441 0.490 1
4 16 agree 0.469 0.0487 0.445 0.493 1
5 10 disagree 0.139 0.0793 0.122 0.159 1
6 16 disagree 0.221 0.0663 0.199 0.244 1
7 10 strongly.disagree 0.0561 0.105 0.0461 0.0682 1
8 16 strongly.disagree 0.106 0.0885 0.0908 0.124 1
::ggemmeans(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]"),
condition = c(female = "female")) %>%
data.frame()
# A tibble: 8 x 7
x predicted std.error conf.low conf.high response.level group
<dbl> <dbl> <dbl> <dbl> <dbl> <fct> <fct>
1 10 0.314 0.0178 0.279 0.349 strongly agree 1
2 10 0.472 0.0124 0.448 0.496 agree 1
3 10 0.151 0.0107 0.130 0.172 disagree 1
4 10 0.0624 0.00641 0.0498 0.0749 strongly disagree 1
5 16 0.187 0.0124 0.162 0.211 strongly agree 1
6 16 0.461 0.0125 0.437 0.486 agree 1
7 16 0.235 0.0130 0.209 0.260 disagree 1
8 16 0.117 0.0100 0.0976 0.137 strongly disagree 1
Predictions for specific values: females with 10 or 16 years education
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("female", # 1st var = `x`
"educate [10, 16]")) %>% # 2nd var = `group`
data.frame()
# A tibble: 16 x 7
x group response.level predicted std.error conf.low conf.high
<fct> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 male 10 strongly.agree 0.371 0.0909 0.331 0.414
2 female 10 strongly.agree 0.314 0.0825 0.281 0.350
3 male 16 strongly.agree 0.228 0.0818 0.201 0.258
4 female 16 strongly.agree 0.187 0.0820 0.164 0.212
5 male 10 agree 0.454 0.0544 0.428 0.481
6 female 10 agree 0.472 0.0496 0.448 0.496
7 male 16 agree 0.475 0.0489 0.451 0.499
8 female 16 agree 0.461 0.0504 0.437 0.486
9 male 10 disagree 0.125 0.0937 0.106 0.147
10 female 10 disagree 0.151 0.0834 0.132 0.174
11 male 16 disagree 0.203 0.0756 0.180 0.228
12 female 16 disagree 0.235 0.0721 0.210 0.261
13 male 10 strongly.disagree 0.0491 0.120 0.0392 0.0613
14 female 10 strongly.disagree 0.0624 0.110 0.0509 0.0762
15 male 16 strongly.disagree 0.0935 0.101 0.0780 0.112
16 female 16 strongly.disagree 0.117 0.0968 0.0990 0.138
::ggemmeans(model = fit_polr_2,
ggeffectsterms = "female",
condition = c(educate = 12,
polviewsN = 4.5))
# A tibble: 8 x 7
x predicted std.error conf.low conf.high response.level group
<fct> <dbl> <dbl> <dbl> <dbl> <fct> <fct>
1 male 0.335 0.0169 0.302 0.368 strongly agree 1
2 male 0.467 0.0124 0.442 0.491 agree 1
3 male 0.141 0.00969 0.122 0.160 disagree 1
4 male 0.0570 0.00571 0.0458 0.0682 strongly disagree 1
5 female 0.281 0.0141 0.254 0.309 strongly agree 1
6 female 0.477 0.0121 0.453 0.501 agree 1
7 female 0.169 0.0101 0.149 0.189 disagree 1
8 female 0.0723 0.00653 0.0595 0.0851 strongly disagree 1
13.6.1 Plot Predicted Probabilites
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]", # x-axis
"female")) %>% # lines by group
data.frame() %>%
ggplot(aes(x = x,
y = predicted,
color = group,
shape = group)) +
geom_point(size = 4) +
geom_line(aes(linetype = group)) +
facet_wrap(~ response.level)
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]", # x-axis
"female")) %>% # lines by group
data.frame() %>%
::filter(response.level == "strongly.agree") %>%
dplyrggplot(aes(x = x,
y = predicted,
color = group)) +
geom_point(size = 4) +
geom_line(aes(linetype = group))
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]", # x-axis
"female")) %>% # lines by group
data.frame() %>%
::filter(response.level == "strongly.agree") %>%
dplyrggplot(aes(x = x,
y = predicted,
color = group,
shape = group)) +
geom_errorbar(aes(ymin = conf.low,
ymax = conf.high),
width = .5,
position = position_dodge(width =.25)) +
geom_point(size = 4,
position = position_dodge(width =.25)) +
geom_line(aes(linetype = group),
position = position_dodge(width =.25)) +
theme_bw() +
labs(x = "Education, years",
y = "Predicted Probability for Strongly Agree",
color = NULL,
shape = NULL,
linetype = NULL)
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("educate [10, 16]", # x-axis
"female")) %>% # lines by group
data.frame() %>%
::mutate(group = forcats::fct_rev(group)) %>%
dplyr::filter(response.level == "strongly.agree") %>%
dplyrggplot(aes(x = x,
y = predicted,
shape = group)) +
geom_errorbar(aes(ymin = conf.low,
ymax = conf.high),
width = .25,
position = position_dodge(.2)) +
geom_point(size = 4,
position = position_dodge(.2)) +
geom_line(aes(linetype = group),
size = 1,
position = position_dodge(.2)) +
theme_bw() +
theme(legend.position = c(1, 1),
legend.justification = c(1.1, 1.1),
legend.key.width = unit(2, "cm"),
legend.background = element_rect(color = "black")) +
scale_linetype_manual(values = c("solid", "longdash")) +
labs(x = "Years of Formal Education",
y = "Predicted Probabilit for\nResponding 'Strongly Agree'",
color = NULL,
shape = NULL,
linetype = NULL,
title = "Adjusted Predictions: Strongly Agree Spanking is Appropriate")
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("female")) %>% # lines by group
data.frame() %>%
::filter(response.level %in% c("strongly.agree",
dplyr"strongly.disagree")) %>%
::mutate(resonse.level = factor(response.level)) %>%
dplyrggplot(aes(x = x,
y = predicted,
fill = resonse.level)) +
geom_col(position = position_dodge())
::ggeffect(model = fit_polr_2,
ggeffectsterms = c("female")) %>% # lines by group
data.frame() %>%
::filter(response.level %in% c("strongly.agree",
dplyr"strongly.disagree")) %>%
::mutate(resonse.level = factor(response.level)) %>%
dplyrggplot(aes(x = forcats::fct_rev(x),
y = predicted,
fill = resonse.level)) +
geom_col(position = position_dodge()) +
theme_bw() +
theme(legend.position = "bottom") +
scale_fill_manual(values = c("gray30", "gray70")) +
labs(x = NULL,
y = "Predicted Probability of Response",
fill = NULL,
title = "Attitues towareds Spanking, by Sex")
13.6.2 Model Fit and Variance Explained
<- MASS::polr(spanking ~ female,
fit_polr_1redeo data = data_gss_model %>%
::filter(complete.cases(educate, polviewsN))) dplyr
anova(fit_polr_2, fit_polr_1redeo)
# A tibble: 2 x 7
Model `Resid. df` `Resid. Dev` Test ` Df` `LR stat.` `Pr(Chi)`
<chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
1 female 1817 4501. "" NA NA NA
2 female + educate~ 1815 4397. "1 vs~ 2 105. 0
::compare_performance(fit_polr_2, fit_polr_1redeo, rank = TRUE) performance
# A tibble: 2 x 8
Name Model AIC BIC R2_Nagelkerke RMSE Sigma Performance_Score
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 fit_polr_2 polr 4409. 4442. 0.179 2.06 1.56 0.8
2 fit_polr_1redeo polr 4509. 4531. 0.00384 2.06 1.57 0.2
13.6.3 Assumptions
<IP_ADDRESS> Proportional Odds: Brant Test
The poTest
function implements tests proposed by Brant (1990) for proportional odds for logistic models fit by the polr()
function in the MASS package.
# Hoffmann's Example 4.8
::poTest(fit_polr_2) car
Tests for Proportional Odds
MASS::polr(formula = spanking ~ female + educate + polviewsN,
data = data_gss_model)
b[polr] b[>strongly agree] b[>agree] b[>disagree] Chisquare df
Overall 8.80 6
femalefemale 0.2532 0.2342 0.2180 0.4719 2.64 2
educate 0.1153 0.1248 0.1036 0.0927 1.17 2
polviewsN -0.2215 -0.1622 -0.2558 -0.2872 4.85 2
Pr(>Chisq)
Overall 0.185
femalefemale 0.268
educate 0.558
polviewsN 0.089 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A significant test statistics provides evidence that the parallel regression assumption has been violated!


Defining Custom Hamiltonians¶
In this tutorial, we will see how to define custom Hamiltonians in NetKet.
NetKet provides two operator
classes for defining custom Hamiltonians.
netket.operator.GraphOperator
netket.operator.LocalOperator
We will explore both of these methods in this tutorial.
Let’s start.
[2]:
# Import netket library
import netket as nk
# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
1) GraphOperator¶
We shall use the GraphOperator
to define the spin half \(J_1\)-\(J_2\) model in one dimension. The Hamiltonian
Here \(\vec{\sigma}=(\sigma^x,\sigma^y,\sigma^z)\) stand for the vector of Pauli matrices. Each term is the sum is an operator defined on the bonds of a graph. For example, we can define a graph with two types of edges: nearest-neighbour and next-nearest-neighbour. We can then specify a bond operator for each type of edge. This is exactly what we need to define the model above.
First, we need a custom graph nk.graph.CustomGraph
. To initialise the class we simply provide a list of edges in the [[site_i, site_j, edge_color], ...]
. In our example, we give the edge_color
1
for nearest-neighbour edges and the 2
for next-nearest-neighbour edges.
[3]:
# J1-J2 Model Parameters
J = [1, 0.2]
L = 20
# Define custom graph
edge_colors = []
for i in range(L):
edge_colors.append([i, (i+1)%L, 1])
edge_colors.append([i, (i+2)%L, 2])
# Define the netket graph object
g = nk.graph.CustomGraph(edge_colors)
# Printing out the graph information
print('This graph has', g.n_sites, 'sites')
print('with the following set of edges:', g.edges)
This graph has 20 sites
with the following set of edges: [[17, 19], [16, 18], [15, 17], [14, 16], [14, 15], [13, 15], [13, 14], [12, 14], [12, 13], [11, 13], [11, 12], [10, 12], [1, 19], [10, 11], [0, 19], [9, 11], [0, 18], [9, 10], [8, 10], [8, 9], [7, 9], [7, 8], [6, 8], [6, 7], [5, 7], [5, 6], [4, 6], [4, 5], [18, 19], [3, 5], [3, 4], [17, 18], [2, 4], [2, 3], [16, 17], [1, 3], [1, 2], [15, 16], [0, 2], [0, 1]]
Next, let’s define the Hilbert space of our model. Note that we impose here to select only configurations with zero total magnetization:
[5]:
# Spin 1/2 based Hilbert Space
hi = nk.hilbert.Spin(s=0.5, total_sz=0.0, graph=g)
Now, we need to create the relevant bond operators. Since we have two type of terms in our Hamiltonian, we need two different bond operators. To do this, we simply express the interaction term as a matrix in the computational basis of the relevant local Hilbert space. In our case, since we are dealing with spin-half degrees of freedom, the local basis of bond is simply \(\lvert \uparrow \uparrow \rangle\), \(\lvert \uparrow \downarrow \rangle\), \(\lvert \downarrow \uparrow \rangle\), \(\lvert \downarrow \downarrow \rangle\). Since
\begin{equation} \vec{\sigma}_{i} \cdot \vec{\sigma}_{i+1} = {\sigma}_{i}^{z}{\sigma}_{i+1}^{z} + {\sigma}_{i}^{x}{\sigma}_{i+1}^{x} + {\sigma}_{i}^{y}{\sigma}_{i+1}^{y} \end{equation}
we just need to represent each term as kronecker product of the standard Pauli matrix.
[6]:
# Pauli Matrices
sigmaz = [[1, 0], [0, -1]]
sigmax = [[0, 1], [1, 0]]
sigmay = [[0, -1j], [1j, 0]]
# Bond Operator
interaction = np.kron(sigmaz, sigmaz) + np.kron(sigmax, sigmax) + np.kron(sigmay, sigmay)
bond_operator = [
(J[0] * interaction).tolist(),
(J[1] * interaction).tolist(),
]
bond_color = [1, 2]
The GraphOperator
can now be defined simply by doing providing the list of bond operators and the corresponding list of bond colors.
[7]:
# Custom Graph Hamiltonian operator
op = nk.operator.GraphOperator(hi, bondops=bond_operator, bondops_colors=bond_color)
The Hamiltonian is now defined and one can proceed to perform variational Monte Carlo or supervised learning or exact diagonalisation. The code snippet below gives us the exact diagonalisation result for the ground state energy of our Hamiltonian.
[8]:
res = nk.exact.lanczos_ed(op, first_n=1, compute_eigenvectors=False)
print("Exact J1J2 ground state energy = {0:.3f}".format(res.eigenvalues[0]))
Exact J1J2 ground state energy = -32.812
2) LocalOperator¶
The second method we can use is through the LocalOperator
class. Let’s use this method to define a one-dimensional spin half transverse field Ising model given by the Hamiltonian:
.
As before, we start by defining the graph on which our degrees of freedom sit.
Once again, we use the CustomGraph
, but this time we do not need to provide our edges with colors. We simply provide it with the list of edges.
[30]:
h = 0.5
L = 16
edges = []
for i in range(L):
edges.append([i, (i+1)%L])
g = nk.graph.CustomGraph(edges)
Next, we define the Hilbert space as earlier, except that this time we do not impose the constraint on total magnetization total_sz
(as it is not a quantity conserved by this Hamiltonian this time)
[31]:
# Spin based Hilbert Space
hi = nk.hilbert.Spin(s=0.5, graph=g)
Now, we simply define a list of local operators corresponding to the different terms in the Hamiltonian and also a list containing the sites on which the respective local operators acts on.
[32]:
# Pauli Matrices
sigmaz = np.array([[1, 0], [0, -1]])
sigmax = np.array([[0, 1], [1, 0]])
operators = []
sites = []
# Local Field term
for i in range(L):
operators.append((h*sigmax).tolist())
sites.append([i])
# Ising iteraction
for i in range(L):
operators.append((-np.kron(sigmaz,sigmaz)).tolist())
sites.append([i, (i+1)%L])
Then, we create the LocalOperator
by proving the list of operators and the list of sites.
[33]:
op = nk.operator.LocalOperator(hi, operators=operators, acting_on=sites)
And finally we again compute the ground-state energy
[34]:
res = nk.exact.lanczos_ed(op, first_n=1, compute_eigenvectors=False)
print("Exact transverse Ising ground state energy = {0:.3f}".format(res.eigenvalues[0]))
Exact transverse Ising ground state energy = -17.017


{% extends "_base.html" %} {% block title %}Request to add an email address to your Matrix account{% endblock %} {% block body %}
A request to add an email address to your Matrix account has been received. If this was you, please click the link below to confirm adding this email:
{{ link }}If this was not you, you can safely ignore this email. Thank you.
{% endblock %}


Satinders-MacBook-Pro:~ satinder$ brew tap ns408/homebrew-libnspv
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
zrepl
==> Tapping ns408/libnspv
Cloning into '/usr/local/Homebrew/Library/Taps/ns408/homebrew-libnspv'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 1 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
Tapped 1 formula (31 files, 26.5KB).
Satinders-MacBook-Pro:~ satinder$ brew uninstall libnspv
Error: No such keg: /usr/local/Cellar/libnspv
Satinders-MacBook-Pro:~ satinder$ brew install libnspv
==> Installing libnspv from ns408/libnspv
==> Downloading https://github.com/ns408/libnspv/archive/0.1.tar.gz
==> Downloading from https://codeload.github.com/ns408/libnspv/tar.gz/0.1
######################################################################## 100.0%
==> ./autogen.sh
==> ./configure --prefix=/usr/local/Cellar/libnspv/0.1
==> make
==> make install
�� /usr/local/Cellar/libnspv/0.1: 49 files, 1.7MB, built in 54 seconds
Satinders-MacBook-Pro:~ satinder$ ns
nscurl nslookup nspv nsupdate
Satinders-MacBook-Pro:~ satinder$