<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>_o_________ ___ _______</title>
    <link>http://xn.pinkhamster.net/blog/</link>
    <description>A blog that hasn't yet lived up to it's title.</description>
    <language>en</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>blosxom/2.1.2</generator>

  <item>
    <title>Reframing Multi-factor Authentication</title>
    <pubDate>Wed, 04 Feb 2026 16:45:00 -0600</pubDate>
    <link>http://xn.pinkhamster.net/blog/2026/02/04#reframing-multi-factor-authentication</link>
    <category>/tech</category>
    <guid isPermaLink="false">http://xn.pinkhamster.net/blog/tech/reframing-multi-factor-authentication</guid>
    <description>
&lt;p&gt;In December, I was the victim of a &lt;a href=&quot;https://en.wikipedia.org/wiki/Domain_hijacking&quot;&gt;domain hijacking
attack&lt;/a&gt;  in which Google
Domains transferred control of all of my domains from my Google account to an
attacker&apos;s Google account.  These domains are used for my personal and business
email, and all of my online accounts were associated with my email addresses at
these domains. By gaining control of my domains, the attacker was able direct
email sent to my domains to a mail server under his control so that he could
intercept incoming email for my domains.&lt;/p&gt;
&lt;p&gt;With control of incoming email, the attacker was able to gain control of
some of the accounts registered using these email addresses.  He was
able to compromise those accounts that did not have multi-factor authentication
enabled, requiring that, after password authentication, a one-time password
sent by SMS or a generated time-based one-time password (&lt;a href=&quot;https://en.wikipedia.org/wiki/Time-based_one-time_password&quot;&gt;TOTP&lt;/a&gt;) using a shared
secret.&lt;/p&gt;
&lt;p&gt;As a result of this attack, I have a new perspective on the value of
&lt;a href=&quot;https://en.wikipedia.org/wiki/Multi-factor_authentication&quot;&gt;multi-factor
authentication&lt;/a&gt;.
Re-framing how multi-factor authentication is described, in terms of
possessions that one is unlikely to concurrently lose control over, makes its
value clearer and provides a better way of thinking about the risks of an
account being compromised.&lt;/p&gt;
&lt;p&gt;A list of recommendations is provided at the end.&lt;/p&gt;
&lt;h2&gt;Traditional Framing of MFA&lt;/h2&gt;
&lt;p&gt;The traditional description of multi-factor authentication is a mechanism that
requires two things in order to authenticate oneself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;something the user knows&lt;/li&gt;
&lt;li&gt;something the user has&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &quot;something the user knows&quot; is typically a password.  The &quot;something the
user has&quot; is often a mobile phone, which either can receive SMS messages or
has an application installed such as Google Authenticator, which stores shared
keys used to generate one-time codes.&lt;/p&gt;
&lt;p&gt;Describing of MFA in these terms is misleading for a few reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the password is no longer something the user knows&lt;/li&gt;
&lt;li&gt;&quot;something the user has&quot; is too abstract&lt;/li&gt;
&lt;li&gt;suggests there are only two distinct things which the user must have&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It is no longer common nor recommended for users to know the password used to
access each online service. Most people use tens to hundreds of services.  It&apos;s
not feasible to remember separate passwords for each service.  Since users do
not have control over how services store passwords, it&apos;s also not recommended
to use the same password for multiple services.  There have been numerous cases
of passwords being leaked due to security compromises.&lt;/p&gt;
&lt;p&gt;Because it&apos;s impractical to know your passwords, a password manager must be
used.  To make use of a password manager, you will typically want it to be
available on the computers you are using regularly.  These are probably your
laptop/desktop and your phone.  Storing your web application passwords in your
Google account or your iCloud keychain, for example, keep your passwords where
you need to access them.&lt;/p&gt;
&lt;p&gt;Similarly, when you need to generate TOTP codes, it makes to do so on your
phone or on your computer using an application like 1Password.&lt;/p&gt;
&lt;p&gt;Multi-factor authentication, using a password manager and a TOTP generator
therefore is better described as &quot;something the user has&quot; (a password manager)
and &quot;something else the user has&quot; (a TOTP generator).  If both of these are
available on the same device, an attacker gaining control of one will likely
gain control of the other.&lt;/p&gt;
&lt;p&gt;So prior to the attack I underestimated the value of multi-factor
authentication because I thought of it primarily in terms of what would happen
if an attacker gained control of my computer.  If gaining control gave them
access to all of the factors needed to access an account, multi-factor
authentication wasn&apos;t better than one-factor authentication.&lt;/p&gt;
&lt;h2&gt;Better Framing As Possessions&lt;/h2&gt;
&lt;p&gt;A better way to think about multi-factor authentication is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;requiring multiple possessions, the exclusive control over which is unlikely to be lost concurrently&lt;/li&gt;
&lt;li&gt;understanding which possessions are fungible as authentication factors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the domain hijacking attack, my computer wasn&apos;t compromised.  None of my
account passwords were compromised.  None of the keys used to generate TOTP
codes were compromised.  What was compromised was the possession that can be
described as control over incoming email (COIE), and COIE is often equivalent
to a password.&lt;/p&gt;
&lt;p&gt;Some applications make the equivalence of a password and COIE explicit.  Slack,
for example, will email you a one-time code to log in by default.
(Authenticating using a password is also possible.)&lt;/p&gt;
&lt;p&gt;Most other applications will allow you to reset your password if you have COIE,
implicitly making the password and COIE equivalent with respect to
authentication.&lt;/p&gt;
&lt;h2&gt;Equivalent Possessions&lt;/h2&gt;
&lt;p&gt;When authenticating using a service that makes a password and COIE equivalent,
one of the required factors is therefore one of two possessions. If your
account also has MFA configured to require a TOTP code, you need these two
possessions to authenticate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;password &lt;strong&gt;or&lt;/strong&gt; COIE&lt;/li&gt;
&lt;li&gt;TOTP key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some services may allow email to be used to receive one-time codes after
authenticating using a password.  If the service also allows resetting the
password through email verification, these two factors are effectively reduced
to one.&lt;/p&gt;
&lt;p&gt;Similarly, if a service allows you to reset your password by verifying control
over incoming SMS and also allows you to receive one-time codes via SMS,
two-factor authentication would effectively be reduced to a single factor.&lt;/p&gt;
&lt;p&gt;Now consider a scenario in which your passwords are stored in Google Chrome on
your laptop computer and one-time passwords are sent via SMS to your phone.
This ostensibly requires two distinct possessions to authenticate, your laptop
and your phone.  But you can inadvertently reduce this to a single possession
if your SMS messages are available on your computer through iMessage or
Google&apos;s Messages web client (&lt;a href=&quot;http://messages.google.com&quot;&gt;messages.google.com&lt;/a&gt;), for example.  (Google has
recently started trying mitigate this risk by displaying messages such as &quot;Use
the Google Messages app on your phone to chat with Microsoft&quot; when viewing
messages from Microsoft or Google on the Messages web client. The browser
notifications still show the full messages so this is apparently still
a work-in-progress.)&lt;/p&gt;
&lt;h2&gt;Additional Considerations&lt;/h2&gt;
&lt;h3&gt;Account Access Chaining&lt;/h3&gt;
&lt;p&gt;Often, one service will grant access to possessions that can be used as one or
more factors to authenticate to another service.  For example, if you use Gmail
for email and your Google account is compromised, that grants access to the
COIE possession used for authentication for many other services.&lt;/p&gt;
&lt;h3&gt;Delegated Authentication&lt;/h3&gt;
&lt;p&gt;Some services allow using another service&apos;s account to authenticate.  For
example, a service may allow you to sign in with your Google or Facebook
account.  There is a trade-off here.  If you are using your Facebook to
authenticate to multiple other services, and your Facebook account is
compromised, the attacker can use it to gain access to all of those other
services.&lt;/p&gt;
&lt;p&gt;On the other hand, providing robust multi-factor authentication for
a service is non-trivial.  Facebook certainly devotes more resources to account
security than many other services so it may be easier to maintain control of
one Facebook account than a multitude of services with their own authentication
mechanisms.&lt;/p&gt;
&lt;h3&gt;Segregation of Possessions&lt;/h3&gt;
&lt;p&gt;You may also want to segregate your possessions such that you have multiple
instances of the same type of possession which are used to access different
accounts.  For example, you can use one email address for your bank accounts,
and a different email address that&apos;s used for correspondence and to register
for social media accounts or the marketing emails from your e-commerce accounts.&lt;/p&gt;
&lt;p&gt;You could use a separate phone to generate your TOTP codes.  It can be an old
phone that doesn&apos;t have service that is kept at your desk.  This makes access
to your desk, in effect, a required possession for authentication (assuming the
recovery codes that are treated as equivalent possessions are printed out and
kept at the desk as well).  There is a trade-off in that you will only be able
to log into these accounts while at your desk, but it may be worthwhile or even
desirable for certain types of accounts.&lt;/p&gt;
&lt;h3&gt;Notification&lt;/h3&gt;
&lt;p&gt;You want to be notified when one of your factors is used unexpectedly.  Even if
the second factor fails, you want to be notified if someone enters your
password unexpected from a new location, for example.&lt;/p&gt;
&lt;p&gt;This is analogous to having a deadbolt lock on your front door, the key to
which is factor 1, along with a safe in your home to protect valuables, the
code to which is factor 2 (unless you have lots of safes, you probably can keep
this password in your head).  It&apos;s useful to have an alarm on the front door
that goes off even if a thief can&apos;t successfully break into your safe on their
first try.&lt;/p&gt;
&lt;h2&gt;Recommendations&lt;/h2&gt;
&lt;p&gt;When evaluating the security of existing online accounts and when setting up
accounts with new services, I offer the following suggestions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable multi-factor authentication, even on accounts that you think no
attacker would want to target
&lt;ul&gt;
&lt;li&gt;Are your password manager and phone or authenticator applications likely to be compromised concurrently?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test the login process if your password was compromised through &lt;a href=&quot;https://en.wikipedia.org/wiki/Shoulder_surfing_(computer_security)&quot;&gt;shoulder
surfing&lt;/a&gt;,
for example&lt;/li&gt;
&lt;li&gt;Test the &quot;forgot your password&quot; flow
&lt;ul&gt;
&lt;li&gt;Pretend someone control control of our phone number through a &lt;a href=&quot;https://en.wikipedia.org/wiki/SIM_swap_scam&quot;&gt;SIM-swapping&lt;/a&gt; attack&lt;/li&gt;
&lt;li&gt;Pretend someone got control of your email inbox&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use a password manager with long, automatically generated passwords like the one built into Chrome
&lt;ul&gt;
&lt;li&gt;It&apos;s not necessary to change passwords regularly; a brute-force attack is unfeasible in most situations&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If pairing text messages between your phone and computer, configure the pairing to not persist indefinitely&lt;/li&gt;
&lt;li&gt;Consider using a different email address for important accounts like banking
than you use for correspondence and marketing emails&lt;/li&gt;
&lt;li&gt;Consider using a separate device to generate TOTP codes for you accounts you
only need to access at home&lt;/li&gt;
&lt;li&gt;Consider deleting email and text messages from account service providers
automatically or periodically.  If your mailbox compromised, these give the
attacker a list of new targets.&lt;/li&gt;
&lt;li&gt;Consider using delegated authentication if available, using your Google or
Facebook account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to securing access to your accounts, you may want to take
additional precautions in securing your financial accounts.  In the US, you can
place a fraud alert on your credit file at each of the three main credit
reporting agencies.  You can do this prior to being a victim of fraud.  You
have to renew it annually, but it notifies potential creditors to take extra
precautions in verifying your identity.  You can also put a freeze on your
credit reports, which should prevent any new creditors from issuing new credit
using your name and social security number until you lift the freeze.&lt;/p&gt;
&lt;p&gt;To reduce the likelihood of credit card fraud, you might consider not storing
your credit card details with e-commerce sites.  Large sites like Amazon will
require that credit cards be re-entered when shipping orders to a new address,
but smaller retailers may not.  As with delegated authentication, consider
delegating paying by credit card to Google Pay, Apple Pay, or Amazon Pay when
available.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Experience Buying Residential Real Estate Without a Buyer&apos;s Agent</title>
    <pubDate>Wed, 16 Mar 2022 06:56:00 -0500</pubDate>
    <link>http://xn.pinkhamster.net/blog/2022/03/16#buying-residential-real-estate-without-a-buyers-agent</link>
    <category>/misc</category>
    <guid isPermaLink="false">http://xn.pinkhamster.net/blog/misc/buying-residential-real-estate-without-a-buyers-agent</guid>
    <description>
&lt;p&gt;
In response to &lt;a href=&quot;https://twitter.com/faraz_r_khan/status/1452057985501437952&quot;&gt;https://twitter.com/faraz_r_khan/status/1452057985501437952&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I think buyers without agents are pretty rare.  In Portland, a listing agent
refused to present my initial offer to the seller, despite a legal obligation
to do so, because it wasn&apos;t on the customary form created by the local Realtor
association.  I ended up buying a license for the forms, plus a license for
the software to complete the forms.  I resubmitted the offer, and the rest of
the closing process went smoothly.  The seller&apos;s agent had to a little extra
work that a buyer&apos;s agent might typically do, being present for the inspection
and appraisal.  The sale price was about 9% below the asking price.  I don&apos;t
know if the listing agent reduced his commission, about $13k that was saved by
not paying a buyer&apos;s agent commission.
&lt;/p&gt;

&lt;p&gt;
I made an offer on another property without a buyer&apos;s agent, contingent on me
being able to see it, and the listing agent refused to schedule time to show me
the property.  That one received multiple offers above asking so she didn&apos;t
feel obliged to deal with an unusual situation, I guess.
&lt;/p&gt;

&lt;p&gt;
The second property I bought without a buyer&apos;s agent was in Chicago.  The
seller was a real estate agent.  He was fine using the purchase agreement form
created by an Illinois lawywers association, which is publicly available.  I
believe the Chicago Realtors association has their own forms as well that
aren&apos;t available to non-Realtors/lawyers.  In Chicago, buyers and sellers
typically use lawyers in addition to real estate agents, but close through
escrow at a title company.  I didn&apos;t bother hiring a lawyer for this
transaction.  (The lawyer we used on the purchase of our primary residence was
about $800.)
&lt;/p&gt;

&lt;p&gt;
I haven&apos;t sold a property without an agent, but if you have time to do
showings/open houses, I don&apos;t see any reason not to.  The buyer will likely
have an agent, and the agent will probably expect the customary commission from
you.  I know someone who came to an agreement with a buyer&apos;s agent for a 1%
commission.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>A Proposal for NFTs with Actual Property Rights</title>
    <pubDate>Wed, 12 Jan 2022 07:51:00 -0600</pubDate>
    <link>http://xn.pinkhamster.net/blog/2022/01/12#proposal_for_NFTs_with_actual_property_rights</link>
    <category>/tech</category>
    <guid isPermaLink="false">http://xn.pinkhamster.net/blog/tech/proposal_for_NFTs_with_actual_property_rights</guid>
    <description>
&lt;p&gt;
I&apos;d like to propose a project that makes use of the technology behind NFTs
while solving real problems: digital concert tickets
&lt;/p&gt;

&lt;p&gt;
As of early 2022, none of the popular NFT projects provide any actual property
rights.  The only right associated with each token is the right to transfer the
token to someone else.  This includes projects like the Bored Apes Yacht Club,
where the cost of membership in the yacht club is comparable to lifetime
membership at an actual yacht club; you get the exclusivity without access to
an actual yacht club.
&lt;/p&gt;

&lt;p&gt;
There are applications where being able to verify and trade property rights
in unique assets could potentially be done at lower cost through the technology
introduced with blockchains.  I&apos;ve previously argued that efficient
replacements for rights licensing organizations like ASCAP and BMI, real estate
title search/insurance companies, and ownership or shareholder tracking like MERS
or ProxyVote are areas that could be fruitful for exploration.
&lt;/p&gt;

&lt;p&gt;
Any of these would be large a undertaking so I&apos;ll propose a more tractable
problem in concert ticket NFTs.
&lt;/p&gt;

&lt;p&gt;
Concert tickets have characteristics and associated problems that make them
well-suited for being represented as NFTs.  They are
&lt;ul&gt;
&lt;li&gt;Non-fungible: each ticket grants the right to use a specific seat in a specific venue for a specific duration&lt;/li&gt;
&lt;li&gt;High Value: each one trades at tens or hundreds (sometimes thousands) of dollars&lt;/li&gt;
&lt;li&gt;Existing solutions prone to counterfeiting&lt;/li&gt;
&lt;li&gt;Secondary markets are inefficient&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Here&apos;s how concert tickets as NFTs would work.
&lt;ol&gt;
&lt;li&gt;The venue (or venue&apos;s agent) selects a network on which the tickets will be issued&lt;/li&gt;
&lt;li&gt;The venue owner issues one Entrance Ticket as an NFT for each seat at the venue for an upcoming concert&lt;/li&gt;
&lt;li&gt;The venue owner either sets prices for each Entrance Ticket or auctions the tickets&lt;/li&gt;
&lt;li&gt;The Entrance Ticket is transferred to the buyer, completing the initial sale&lt;/li&gt;
&lt;li&gt;The buyer can resell the Entrance Ticket until the end of the concert&lt;/li&gt;
&lt;li&gt;On their way into the venue before the concert, the owner of the Entrance Ticket
exchanges with the ticket collector their Entrance Ticket for a Seat Ticket&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
This solves a few problems with current ticketing solutions.
&lt;/p&gt;

&lt;p&gt;
Buyers can verify that they are buying an authenticate ticket.  They would verify
that the issuer is the venue owner off-chain.  The venue owner should publish
the the public key of the issuer.  They can simply publish it on their web site, or
they could make use of a identity-linking mechanism like Keybase to link their
public key to multiple identities such as a twitter profile, a domain in DNS
that they own, and a website that they manage to provide buyers greater
confidence that they are buying from the legitimate seller.
&lt;/p&gt;

&lt;p&gt;
When one concertgoer wants to buy a ticket from a previous buyer in a secondary
transaction, buyers can verify on-chain that the ticket they are buying was
originally issued by the venue by verifying the identity of the original
issuer.
&lt;/p&gt;

&lt;p&gt;
This solves the problem with buyers potentially buying counterfeit tickets from
third-party sellers using Craigslist, for example.  It also can reduce the
transaction costs associated with buying tickets on the secondary market
through trusted intermediaries like Ticketmaster.
&lt;/p&gt;

&lt;p&gt;
Venues, i.e. ticket issuers, also benefit by eliminating the possibility of
counterfeiting tickets.  Apart from the costs of mediating disputes when two
people show up with the same ticket in the form of a bar code or two people
claim the same seat number based on a printed ticket or screenshot, there will
be a greater demand for tickets from buyers who know that they can resell their
tickets.  Therefore some of the benefit should accrue to ticket issuers in the
form of higher initial ticket sale prices.
&lt;/p&gt;

&lt;p&gt;
Up above, I described how Entrance Tickets are exchanged for Seat Tickets at
the door.  This solves the double-spend problem.  A ticket holder could share
their private key with another person, allowing two people to prove ownership
of the same ticket if ticket ownership is simply checked at the door.
&lt;/p&gt;

&lt;p&gt;
This may be minor problem, but since the tickets need to be checked at the door
anyway, we can have the ticket collector and ticket holder perform a trade
on-chain at the door.
&lt;/p&gt;

&lt;p&gt;
The ticket holder transfers their Entrance Ticket for a Seat Ticket.  The Seat
Ticket is issued for the same seat at the same venue for the same duration, but
is not valid for entering the venue.  Now, a second holder of the private key
can no longer enter the venue, but the ticket holder can still ensure show the
usher which seat they own for the show.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;A note about implementation:&lt;/b&gt;&lt;br&gt;
At the moment, transaction costs on the popular networks for trading NFTs would make
secondary sales and my proposed Entrance-Ticket-for-Seat-Ticket transactions cost
prohibitive so there&apos;s work to be done.  There are nascent
NFT projects on the stellar and ripple networks, where transaction settlement
time and costs are low.  It may be worth exploring funding options from &lt;a href=&quot;https://www.stellar.org/foundation/enterprise-fund&quot;&gt;the Stellar Enterprise Fund&lt;/a&gt; or &lt;a href=&quot;https://ripple.com/creatorfund/&quot;&gt;Ripple&apos;s Creator Fund&lt;/a&gt;.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Cost Accounting as a Poorly Defined Constrained Optimization Model</title>
    <pubDate>Thu, 07 Sep 2017 17:42:00 -0500</pubDate>
    <link>http://xn.pinkhamster.net/blog/2017/09/07#cost-accounting-as-a-poorly-designed-constrained-optimization-model</link>
    <category>/business</category>
    <guid isPermaLink="false">http://xn.pinkhamster.net/blog/business/cost-accounting-as-a-poorly-designed-constrained-optimization-model</guid>
    <description>
&lt;style&gt;
td:nth-child(1n+2) {
	text-align: right;
	padding-left: 5px;
}
&lt;/style&gt;
&lt;p&gt;
I recently read &lt;a href=&quot;http://amzn.to/2vP7YVi&quot;&gt;The Goal&lt;/a&gt;, a business novel
that introduces the &lt;a
href=&quot;https://en.wikipedia.org/wiki/Theory_of_constraints&quot;&gt;Theory of
Constraints&lt;/a&gt; as a toolset for managing a business in order to &quot;more money
now and in the future&quot;.  One of the criticisms the book makes of the way businesses are
often run is that their use of cost accounting to guide decisions fails to
maximize the amount of money the business can make.  An alternative called
throughput accounting is proposed, but after having completed The Goal, I
didn&apos;t have a clear understanding of how and why cost accounting fails.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://amzn.to/2gP1oaS&quot;&gt;&lt;img style=&quot;padding:10px;&quot; height=&quot;200px;&quot; align=&quot;right&quot; src=&quot;/images/41rELGViZdL.jpg&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
So I bought &lt;a href=&quot;http://amzn.to/2gP1oaS&quot;&gt;Throughput Accounting&lt;/a&gt; to dig
in deeper.  The book starts with a great example of a simple decision made
using cost accounting.
&lt;/p&gt;

&lt;p&gt;
A factory makes mens and womens shirts.  To make a shirt, you need some raw
materials, plus the labor to cut fabric and sew fabric.

&lt;ul&gt;
&lt;li&gt;Womens shirts sell for $105.  Mens shirts sell for $100.&lt;/li&gt;
&lt;li&gt;Raw materials for womens shirts cost $45.  Raw materials for mens shirts cost $50.&lt;/li&gt;
&lt;li&gt;Womens shirts require 2 minutes of cutting and 15 minutes of sewing.&lt;/li&gt;
&lt;li&gt;Mens shirts require 10 minutes of cutting and 10 minutes of sewing.&lt;/li&gt;
&lt;li&gt;Market demand is such that we can sell 120 womens shirts per week at $105 and 120 mens shirts at $100.&lt;/li&gt;
&lt;li&gt;We only have 2,400 minutes (1 person at 40 hours per week) of cutting time, and 2,400 minutes of sewing time available each week.&lt;/li&gt;
&lt;li&gt;Labor costs for sewing and cutting are the same.&lt;/li&gt;
&lt;li&gt;Operating expenses are $10,500/week, to pay salaries, rent, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Womens&lt;/td&gt;&lt;td&gt;Mens&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;$105&lt;/td&gt;&lt;td&gt;$100&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Raw Materials&lt;/td&gt;&lt;td&gt;$45&lt;/td&gt;&lt;td&gt;$50&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cutting Time&lt;/td&gt;&lt;td&gt;2 minutes&lt;/td&gt;&lt;td&gt;10 minutes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sewing Time&lt;/td&gt;&lt;td&gt;15 minutes&lt;/td&gt;&lt;td&gt;10 minutes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Total Time&lt;/td&gt;&lt;td&gt;17 minutes&lt;/td&gt;&lt;td&gt;20 minutes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Weekly Demand&lt;/td&gt;&lt;td&gt;120 shirts&lt;/td&gt;&lt;td&gt;120 shirts&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;
Making all 120 womens shirts and 120 mens shirts requires 1,440 minutes (10
min/shirt * 120 mens shirts + 2 min/shirt * 120 womens shirts) of cutting time
and 3,000 minutes (10 min/shirt * 120 mens shirts + 15 min/shirt * 120 womens
shirts) of sewing time.  Since we only have 2,400 minutes of sewing time
available, we can&apos;t make all of the shirts.  &lt;b&gt;How many mens shirts and womens
shirts should we make?&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
Gross profit for mens shirts is $50 ($100 sales price - $50 for raw materials).
Gross profit for womens shirts is $60 ($105 sales price - $45 for raw materials).
Mens shirts require a total of 20 minutes of labor.  Womens shirts require a
total of 17 minutes of labor.
&lt;/p&gt;

&lt;p&gt;
Since womens shirts bring in more revenue, have a higher gross margin, and
require less labor, it seems like a reasonable answer is to produce 120 womens
shirts, and then as many mens shirts as we can with the remaining time we have
available.
&lt;/p&gt;

&lt;p&gt;
120 womens shirts take 1,800 minutes on the sewing machine, so we can make 60
mens shirts with the remaining 600 minutes available on the sewing machine.
(We&apos;re not constrained by cutting.)
This results in a net profit of $-300, i.e. a loss.
&lt;table&gt;
&lt;tr&gt;&lt;td&gt;Revenue&lt;/td&gt;&lt;td&gt;$18,600&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Raw Materials&lt;/td&gt;&lt;td&gt;$8,400&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Gross Margin&lt;/td&gt;&lt;td&gt;$10,200&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Operating Expense&lt;/td&gt;&lt;td&gt;-$10,500&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Net Profit&lt;/td&gt;&lt;td&gt;-$300&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;
Throughput Accounting then explains how to calculate the amount of money (throughput) being
made on the constrained resource per minute, the sewing machine, to decide how many of
each product to make.  But I&apos;m going to use &lt;a
href=&quot;http://www.minizinc.org/&quot;&gt;MiniZinc&lt;/a&gt; to use a contrained optimization
solver to maximize net profit, which will give us the same result.
&lt;/p&gt;

&lt;p&gt;
The constraints above, and the goal of trying to maximize net profit, can be
translated into a MiniZinc model as follows (this would be done in a more
concise manner if there were many products):
&lt;/p&gt;

&lt;pre&gt;
int: womens_sewing_minutes = 15;
int: womens_cutting_minutes = 2;
int: mens_sewing_minutes = 10;
int: mens_cutting_minutes = 10;

int: womens_price = 105;
int: mens_price = 100;

int: womens_raw_costs = 45;
int: mens_raw_costs = 50;

int: max_sewing_minutes = 2400;
int: max_cutting_minutes = 2400;

int: operating_expense = 10500;

int: womens_demand = 120;
int: mens_demand = 120;

var 0..mens_demand: mens_produced;
var 0..womens_demand: womens_produced;

var int: total_sewing_minutes = womens_produced * womens_sewing_minutes + mens_produced * mens_sewing_minutes;
var int: total_cutting_minutes = womens_produced * womens_cutting_minutes + mens_produced * mens_cutting_minutes;

var int: revenue = womens_price * womens_produced + mens_price * mens_produced;
var int: raw_materials_cost = (womens_raw_costs * womens_produced + mens_raw_costs * mens_produced);
var int: gross_margin = revenue - raw_materials_cost;

var int: total_cost = raw_materials_cost + operating_expense;

var int: net_profit = gross_margin - operating_expense;

constraint total_sewing_minutes &lt;= max_sewing_minutes;
constraint total_cutting_minutes &lt;= max_cutting_minutes;
solve maximize net_profit;

output [&quot;mens: \(mens_produced)\n&quot;, &quot;womens: \(womens_produced)\n&quot;, &quot;net profit: \(net_profit)\n&quot;, &quot;total cost: \(total_cost)&quot;];
&lt;/pre&gt;

&lt;p&gt;
And solving the model tells us that we should produce 120 mens shirts and 80
womens shirts for a net profit of $300, rather than a loss.
&lt;/p&gt;

&lt;pre&gt;
$ minizinc clothes.mzn
mens: 120
womens: 80
net profit: 300
total cost: 20100
----------
==========
&lt;/pre&gt;

&lt;p&gt;
Intuitively, what&apos;s going wrong in the cost accounting solution is that we&apos;re lumping
together all of the labor and not taking into consideration that the sewing
machine is our bottleneck, and that we need to maximize the amount of value
we&apos;re getting out of the bottleneck.  Nonetheless, I struggled to translate
this mistake into a MiniZinc model that also gave the wrong answer.
&lt;/p&gt;

&lt;p&gt;
Below is an incorrectly defined constrained optimization model that I think
reflects where we go wrong when trying to use cost accounting for decision
making.  The goal is changed from maximizing net profit to minimizing cost.
But we don&apos;t want to just minimize cost; we could do that by producing zero
shirts.  We also want to produce as many shirts as we can.  I modelled this as
a constraint that says that producing one more mens shirt or one more womens
shirt should cause us to exceed our cutting or sewing constraints.
&lt;/p&gt;

&lt;pre&gt;
int: womens_sewing_minutes = 15;
int: womens_cutting_minutes = 2;
int: mens_sewing_minutes = 10;
int: mens_cutting_minutes = 10;

int: womens_processing = womens_cutting_minutes + womens_sewing_minutes;
int: mens_processing = mens_cutting_minutes + mens_sewing_minutes;

int: womens_price = 105;
int: mens_price = 100;

int: womens_raw_costs = 45;
int: mens_raw_costs = 50;

int: max_sewing_minutes = 2400;
int: max_cutting_minutes = 2400;

int: operating_expense = 10500;

int: womens_demand = 120;
int: mens_demand = 120;

var 0..mens_demand: mens_produced;
var 0..womens_demand: womens_produced;

var int: total_sewing_minutes = womens_produced * womens_sewing_minutes + mens_produced * mens_sewing_minutes;
var int: total_cutting_minutes = womens_produced * womens_cutting_minutes + mens_produced * mens_cutting_minutes;

var int: womens_revenue = womens_price * womens_produced;
var int: womens_raw_materials_cost = womens_raw_costs * womens_produced;
var int: womens_operating_expenses = operating_expense * womens_produced div (womens_produced + mens_produced);
var int: womens_net_profit = womens_revenue - womens_raw_materials_cost - womens_operating_expenses;

var int: mens_revenue = mens_price * mens_produced;
var int: mens_raw_materials_cost = mens_raw_costs * mens_produced;
var int: mens_operating_expenses = operating_expense * mens_produced div (womens_produced + mens_produced);
var int: mens_net_profit = mens_revenue - mens_raw_materials_cost - mens_operating_expenses;

var int: total_cost = womens_operating_expenses + womens_raw_materials_cost + mens_operating_expenses + mens_raw_materials_cost;

var int: net_profit = womens_net_profit + mens_net_profit;

constraint total_sewing_minutes &lt;= max_sewing_minutes;
constraint total_cutting_minutes &lt;= max_cutting_minutes;

% Maximize the number of items produced by ensuring that it must not be
% possible to produce another item
constraint
   ((mens_produced + 1) * mens_sewing_minutes + womens_produced * womens_sewing_minutes &gt; max_sewing_minutes \/
   (mens_produced + 1) * mens_cutting_minutes + womens_produced * womens_cutting_minutes &gt; max_cutting_minutes)
   /\
   (mens_produced * mens_sewing_minutes + (womens_produced + 1) * womens_sewing_minutes &gt; max_sewing_minutes \/
   mens_produced * mens_cutting_minutes + (womens_produced + 1) * womens_cutting_minutes &gt; max_cutting_minutes);

solve minimize total_cost;

output [&quot;mens: \(mens_produced)\n&quot;, &quot;womens: \(womens_produced)\n&quot;, &quot;net profit: \(net_profit)\n&quot;, &quot;total cost: \(total_cost)&quot;];
&lt;/pre&gt;

&lt;p&gt;
Solving this model gives us the original cost accounting result.
&lt;/p&gt;

&lt;pre&gt;
$ minizinc clothes-cost.mzn
mens: 60
womens: 120
net profit: -300
total cost: 18900
----------
==========
&lt;/pre&gt;</description>
  </item>
  <item>
    <title>Acrobat Reader 7 for Linux</title>
    <pubDate>Fri, 07 Jul 2017 18:42:00 -0500</pubDate>
    <link>http://xn.pinkhamster.net/blog/2017/07/07#acroread_7_for_linux</link>
    <category>/tech</category>
    <guid isPermaLink="false">http://xn.pinkhamster.net/blog/tech/acroread_7_for_linux</guid>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://imperialviolet.org/page24.html#e477&quot;&gt;Adam Langley&lt;/a&gt; noticed
that Adobe Reader 7 is now available for Linux.  The update from version 5 has
been long overdue.  The new version uses GDK rather than Motif.  It has some
new features such as Save As Text, and will hopefully eliminate those annoying
warnings about a PDF requiring a newer version of Acrobat Reader (though they
always seem to be perfectly readable).  Multiple PDFs are now opened within a
single application window.
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;/images/acroread_7_linux.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;/images/acroread_7_linux-small.png&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Here are some Debian packages I built based on &lt;a
href=&quot;ftp://ftp.nerim.net/debian-marillat/index.html&quot;&gt;Christian Marillat&apos;s
packages&lt;/a&gt;.  I&apos;m sure he&apos;ll do a better job soon.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Update:&lt;/b&gt; &lt;a
href=&quot;ftp://ftp.nerim.net/debian-marillat/index.html&quot;&gt;Christian Marillat&lt;/a&gt;
has added acroread packages to his testing and unstable repositories.  You
probably want to use those.
&lt;/p&gt;

&lt;iframe src=&quot;/download/acroread/&quot; width=&quot;600&quot; height=&quot;300&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot;&gt;
&lt;a href=&quot;/download/acroread&quot;&gt;Acroread packages&lt;/a&gt;
&lt;/iframe&gt;</description>
  </item>
  </channel>
</rss>
