Gateway
BOT
22-Jun-19 12:33 PM
[telegram] <omg_gawd> Or everyone Selling off becouse of the agama hack (re @ionstar: I don't panic that easily (as a hardcore hodler throughout 2018). But it is frustrating a bit. Maybe the rise of the past few weeks was due to KMD withdrawal locks after the agama hack? Or maybe the person(s) who were stealing the KMD, are selling it off.)
[telegram] <ionstar> That would be a very delayed selloff then. (re @omg_gawd: Or everyone Selling off becouse of the agama hack)
[telegram] <omg_gawd> Deposits was closed on binance (re @ionstar: That would be a very delayed selloff then.)
[telegram] <omg_gawd> Just opened recently again
[telegram] <ionstar> Maybe, but I would assume people do understand that it was an agama issue, and not a KMD issue. I think that that fact was communicated well enough.
[telegram] <cryptosim0n> Most of alts are dropping because of the bitcoin surge. I dont think this is the hacker dumping or people dumping because of the hack
[telegram] <ionstar> I did notice (last week) this hacker was sending "his" balance to a new address every 10 or so minutes.   Why does he try and hack the agama wallet if he’s then going to dump when prices are at all time low btc wise.)
[telegram] <ionstar> I mean if I were the hacker, I would try to get rid of this stash as quickly as possible... get it "washed" into clean crypto/cash
[telegram] <cryptosim0n> Could be, who knows... i dont mind the hacker selling now. Im glad all funds are recovered without the need to hardfork.
[telegram] <cryptosim0n> And we can move on
[telegram] <ionstar> Funds arent really recovered, but rather reimbursed.
[telegram] <cryptosim0n> Yes, I meant reimbursed sorry
[telegram] <tobiasnunes> How can someone prevent receiving some funds of a decentralized coin? That is not possible. If it is, where is the freedom in crypto? Governments could restrict any addresses they want to then and so people would have no freedom at all anymore to buy goods for example in a store (re @ionstar: I did notice (last week) this hacker was sending "his" balance to a new address every 10 or so minutes. I dont know if at some point exchanges will lose track and allow some of these funds to be deposited, and then sold off.)
[telegram] <cryptosim0n> Some were reimbursed, some were recovered (like mine)
[telegram] <cryptosim0n> This. I dont think we should stop the hacker from selling. This is crypto and should be decentralized (re @tobiasnunes: How can someone prevent receiving some funds of a decentralized coin? That is not possible. If it is, where is the freedom in crypto? Governments could restrict any addresses they want to then and so people would have no freedom at all anymore to buy goods for example in a store)
[telegram] <ionstar> Centralised exchanges can ofcourse track and block/seize assets coming from addresses used by hackers. Washer services and decentralised exchanges are different. (re @tobiasnunes: How can someone prevent receiving some funds of a decentralized coin? That is not possible. If it is, where is the freedom in crypto? Governments could restrict any addresses they want to then and so people would have no freedom at all anymore to buy goods for example in a store)
[telegram] <ionstar> I don't see why we should congratulate this person on his successful hack and let him get away with his loot. (re @cryptosim0n: This. I dont think we should stop the hacker from selling. This is crypto and should be decentralized)
[telegram] <Ahmetbtc> Eng(enigma) & İNTEL PARTNERSHİP. Big news coming fomo
Hello to the Enigma community!
[telegram] <tobiasnunes> How they are doing it technically? That should not be possible, because if it is, anyone can do it, and there is no freedom at all. In the future all addresses not verified by kyc could be banned by default.
[telegram] <iamzao> be ready or be sorry
[telegram] <ionstar> KYC, though hated (by me as well) is probably coming at some point for all centralised exchanges through regulation pressure, as it is a way for tax agencies to find out how many crypto assets you have and tax you accordingly.
[telegram] <tobiasnunes> It has nothing to do with let him go. Of course we can try to track him or not let him cash out fiat. But ban deposits should be impossible (re @ionstar: I don't see why we should congratulate this person on his successful hack and let him get away with his loot.)
[telegram] <tobiasnunes> Shouldn't be possible i mean
[telegram] <ionstar> Let him deposit and then seize the funds. (re @tobiasnunes: It has nothing to do with let him go. Of course we can try to track him or not let him cash out fiat. But ban deposits should be impossible)
[telegram] <Keytothegate> It is a good opportunity:
• Kmd/btc cheapest ever
• The news and related project news (mobile dex, Antara, k64, pirate, zilla, redfox, rebranding etc etc) for the next month or so
[telegram] <tobiasnunes> So it's this what happenes? Or can they technical prevent deposits? (re @ionstar: Let him deposit and then seize the funds.)
[telegram] <Keytothegate> Even if we compare to kmd/btc ratio couple of months ago there is room for 3x
[telegram] <ionstar> I dont think they can prevent deposits, as you can send whatever funds to whatever address. But the destination address is owned by the exchange, and thats where it can be stopped. (re @tobiasnunes: So it's this what happenes? Or can they technical prevent deposits?)
[telegram] <ionstar> Centralised exchange
[telegram] <tobiasnunes> Yes, that makes sense (re @ionstar: I dont think they can prevent deposits, as you can send whatever funds to whatever address. But the destination address is owned by the exchange, and thats where it can be stopped.)
[telegram] <tobiasnunes> But I am afraid that in future all stores, all places where you can buy stuff or services for crypto could freeze your funds until you do kyc
[telegram] <tobiasnunes> In the moment you pay, and your address isn't known by government, they freeze it.
[telegram] <ionstar> I read something yesterday about some international regulatory office, that they want all exchanges to submit client data to them, so basically governments can track where funds go... and ofcourse can then be taxed.
[telegram] <tobiasnunes> I mean for private sale between two people it would still be working, but the government could even look your history of addresses and if any is not connected to a person it could mean you get to a red list
[telegram] <ionstar> That could happen. But then you could have private addresses, and have a debitcard connected to it and pay day to day stuff using that debitcard. Though large purchases (like cars) already need to be reported to the government (re @tobiasnunes: I mean for private sale between two people it would still be working, but the government could even look your history of addresses and if any is not connected to a person it could mean you get to a red list)
(edited)
[telegram] <Sungonightly> The Komodo missile is launching now, please fasten your seat belts.
[telegram] <ionstar> i mean here in Holland at leats do large cash purchases need to be reported by the seller (like a car dealership).
[telegram] <Sungonightly>
[telegram] <tobiasnunes> The problem is not taxes, it is that if a government does not like you (people like Edward Snowden) they can block any of your addreses, so you can not buy food in the supermarket. (re @ionstar: i mean here in Holland at leats do large cash purchases need to be reported by the seller (like a car dealership).)
[telegram] <tobiasnunes> I mean they will block all adresses by default, just those kyc addresses can buy stuff
[telegram] <tobiasnunes> But a Edward Snowden can not do kyc
[telegram] <tobiasnunes> Any stores not participating will get in trouble
[telegram] <ionstar> It is all about taxes. The government does not see you as a person, but as their privat eproperty or piggybank. One way or the other, you will pay.
[telegram] <tobiasnunes> It's taxes for the government, yes, but it's not just taxes. It's control also
[telegram] <tobiasnunes> To catch people


Blog
The quick brown fox jumps over the lazy dog.
Games
Blog post title
The quick brown fox jumps over the lazy dog.
Dec 24, 2019
40
48
Movies
Blog post title
The quick brown fox jumps over the lazy dog.
Aug 16, 2019
24
32
Music
Blog post title
The quick brown fox jumps over the lazy dog.
Apr 8, 2019
8
16


--- title: definition.limit keywords: fastai sidebar: home_sidebar summary: "Something about limits" description: "Something about limits" nb_path: "nbs/definition.limit_of_a_function.ipynb" ---
Let $f: D \to \mathbb{R}$ be a real valued function, and assume that $f$


Torn 5 is a ground-up rewrite of Torn 4. It is a tournament scores manager, and can read data from Nexus, Helios and Laserforce systems. It requires .NET Framework 4.0. Note that Torn 5 is currently in a Beta state — it mostly works, but not all features are complete, and there may be bugs. If you are using it to open Torn 4 files, I recommend keeping a safe backup of those .Torn files elsewhere, just in case.
If you're familiar with Torn 4, here's the very quick guide:
Run the program. Click the Leagues button, then Preferences. If you have a lasergame system, select the appropriate system and enter the laser game database server address. For P&C systems, this is the name or IP address of the database server machine. For Laserforce, this is probably lf-main\lf6. (Depending on firewall and SQl Server configuration, you may need to run Torn 5 on the database PC.) If you don't have a lasergame system, just leave it at Demo.
Click OK. Click Latest. This will cause Torn to query the server. A list of games should appear.
On the Leagues toolbar, click New or Open. Torn 5 can open Torn 4 .Torn files. When it save those files it will write extra information. The latest version of Torn 4 will ignore all that extra information, so you should be able to open the file in one, make changes, then open it in the other, and then back again. (But after Torn 4 has opened the file, made changes and saved it again, the extra Torn 5 data will be missing.) For your new (or newly opened) .Torn file, click in the Tag cell at the left of the .Torn file's row in the Leagues list. Enter a tag. This will be used as a sub-folder for this league's reports exports, so use a tag name that is a legal folder name (i.e. does not contain special characters like /\:*?"<>|).
If you like, you can open more league files. This is a difference between Torn 4 and Torn 5 — Torn 5 allows you to have several league files open at once.
Click a game to see its packs/players. Now you can do all the usual Torn things — right-click on a team box and Remember that team, Commit the game, Edit the league, etc.
Because the games listing is now an always-visible list instead of being a drop-down "combo box", you can now select multiple games. Some features work on all selected games — e.g. Forget will remove all the selected games from whatever league they had been committed to. Set Description lets you title committed games or groups of games: "Round 1", "Repechage 3", "Cascade 2", "Finals", etc. These titles will be shown in reports. Games present in the game server are shown in white. Games only present in Torn files are shown slightly greyed.
Reporting is different in Torn 5 — click Set Folder to set an initial folder for reports to be exported to. Then click Report. Torn 5 will export a default set of reports to that folder. Note that these will include details of each team, game and player. If you would like to configure different reports for the selected league, click Configure and then add reports as desired. You can select the output format of your reports: HTML SVG is prettiest, but cannot be imported into Excel etc.
If you select multiple leagues (select one then hold down the ctrl key as you select more) and click Export, all the selected leagues will have reports exported.
If you have enabled the web server under Preferences, any web browser that can see the machine Torn is running on can view reports directly from Torn 5's latest data, without you needing to click Report. If you're running Torn on a machine called mymachine and you've left it on the default port of 8080, point a web browser at http://mymachine:8080 to see these interactive reports.
For P&C systems, for games that have been committed during this run of Torn 5, more data is shown: each game has a "heat map" showing who shot who and a "worm" showing teams' scores. But this (extensive) data is not stored in the .Torn file, so once the lasergame server purges that data and Torn is restarted, a fresh report will not contain this additional detail.
Things not yet implemented: fixture generation, pushing scores to a scoreboard, setting up pyramid rounds, and a variety of other bits and bobs.
Torn's window is divided into several areas. At the top are the toolbars. Note that the left-most on each toolbar is a drop-down menu button. Toolbars can be torn off and floated, or docked at different edges of the window.
At the left is the Leagues list, showing the currently open leagues, with details on the currently focused league shown below it.
To the right of the Leagues list is the Games list showing all the games Torn knows about (because they exist in an open .Torn file, or in the lasergame server database, or both). Clicking a game will show its details to the right.
To the right of the games list is the unallocated players box: players who are in the game focused in the games list but not yet allocated to a team will show here.
To the right of this are the team boxes. These hold players from a single team. If you need more team boxes, Click Add Row or Ad Column in the Teams toolbar. Right-click on team box for a variety of functions, including changing the identity of the team or of a player, or applying a handicap.
To Torn, a league is a collection of games, teams, players and scores. Each league is saved as a .Torn file.
New: create a new league and its coresponding .Torn file. Once you've done this you'll likely want to click in the Tag cell in the Leagues list and give this league a Tag. This will be used as a sub-folder for this league's reports exports, so use a tag name that is a legal folder name (i.e. does not contain special characters like /\:*?"<>|).
Open: Open one or more existing .Torn files. (This dialog supports multi-select.)
Close: Remove the selected leagues from the Leagues list. (Of course, you can re-Open them later.)
Edit: Here you can set a title for the league file, edit team names and player line-ups, and set victory points for the league. (Victory points options are not yet quite as rich as those in Torn 4.)
Leagues ▸ Preferences: brings up the Preferences dialog. These preferences are global to all of Torn, and are not specific to a league.
Leagues ▸ Save: Commit the .Torn file to disk. Most of the time you don't need this button: if you Commit a game, Edit the league, etc., your changes will be automatically saved.
Leagues ▸ Set up Pyramid round: not yet implemented.
Leagues ▸ Set up Fixtures: Torn 5 can import fixtures from text. (Generation of fixtures within Torn 5 is not yet supported.) Once generated, Torn 5 will serve a list of these games from its internal web server, and can export the fixtures as HTML for upload to the web. It will also endeavour to keep track of where you are up to in your fixtures — the Now page from its internal web server will endeavour to identify the game just played (from lasergame server data) and the next game (from fixtures) automatically.
The Fixtures dialog has four tabs: Teams, Games as a list, Games as a gri, and Graphic. On the Teams tab, you'll see a list of teams that the fixture system already knows about. If your league has teams, they will appear here. (League teams and fixture teams are technically separate under the hood.) If not, type or paste a list here, one team per row, and click Import.
The Games as a list page lets you import games for the teams you just created (or already have). If your games have three teams, each line should be a date/time followed by three numbers that represent teams. Existing games are not automatically cleared when you click Import; if you want to clear existing games, click Clear first.
The Games as a grid page is similar. Each row is a team; each column is a game.
The Graphics page gives you a graphical editor for fixtures. Pick colours by clicking a mouse button on the palette at the bottom left — e.g. if you click the middle mouse button on the pink box, the middle mouse button is now pink, and clicking on squares in the grid with the middle mouse button will clear them (if they were not already clear) or mark them as pink (if they were already clear). If your mouse has five buttons, all five can likely be assigned colours in this way.
At the bottom of the grid is a number showing how many teams are in each ame. At the right are numbers showing how many games each team plays. To the right of that is a difficulty number, calculated by averaging the difficulty of all the teams this team plays against, plus a graph plotting those difficulties. To the right of that is the who-plays-who grid. When you click a square in the main grid, the who-plays-who grid highlights the selected team in silver, and the teams this team plays against in this game in the relevant colours.
At bottom right is a control for the size of the grid: set this larger to make grid squares larger.
At the moment the Graphics page assumes that teams are contiguously numbered — if you have deleted teams, thus leaving gaps in the numbering, this display may get a little out of whack.
Leagues ▸ Match: not yet implemented. This is intended for things like Laserforce Space Marines, where two games form a match.
Leagues ▸ Help: this document.
Leagues ▸ About: a brief About dialog.
Latest: clicking this button re-queries the lasergame server, and selects the most recent game in the list.
Commit: this button commits the details of this game, as shown in the team boxes at the right, to Torn's list of remembered games.
Games ▸ Create: not yet implemented.
Games ▸ Edit: not yet implemented.
Games ▸ Set Description: lets you title committed games: "Round 1", "Repechage 3", "Cascade 2", "Finals", etc. These titles will be shown in reports.
Games ▸ Forget: removes the selected games from the league.
Add Row: Adds a row of team boxes.
Remove Row: Removes a row of team boxes.
Add Column: Adds a column of team boxes.
Remove Column: Removes a column of team boxes.
Teams ▸ Remember All Teams: list.
Set Folder: lets you set a folder that reports, when generated, will be exported to. This same folder is used for TSV reports and fixture exports.
Report: generates and saves a set of HTML reports for the selected leagues. If you have not used the Configure button to configure reports for a league, a default set will be used: a team ladder, a games list, a games pyramid or games grid, and a solo ladder. In addition to these "overview" reports, detailed reports will be generated for each game, team and player.
Upload: All files in the reports folder will be uploaded to the web site you specified in Preferences.
Configure: If this dialog is empty, reports for this league will be the default set described above. If you add reports here, those will be used instead. These are configured per-league. This dialog does not have an OK button — changes you make here are immediate. You can select the output format of your reports: HTML SVG is prettiest, but cannot be imported into Excel etc.
Reports ▸ Ad Hoc Report: not yet implemented.
Reports ▸ Pack Report: see below.
Reports ▸ Update Scoreboard: not yet implemented.
Reports ▸ Export Fixtures: exports any fixtures you have set up in Leagues ▸ Set up Fixtures, as HTML.
The pack report endeavours to tell you how "good" or "bad" packs are. It does this via Student's t-test.
Select one or more leagues (hold down the ctrl key to select additional leagues), then click Reports ▸ Pack Report. The report will be generated and saved to the folder you set under Set Destination, as packreport.html.
View the report in your favourite web browser. You'll see several sets of columns, and you should ignore all but one.
If Torn 5 has hit data, it will fill in columns for tag ratios and tag differences. Here's how those are calculated: first we generate a solo ladder showing how "good" each player is. Then, for each pack in each game, we scale the number of tags that pack scored against other players by the "goodness" of the player waering it: if the pack scored 50 hits in a game but was being worn by a player who was 125% as good as the average player, we scale that to 50 / 1.25 = 40 hits. Then we take the ratio of that to the number of tags the pack received during the game. For tag difference we do the same thing, but we subtract the two numbers instead of dividing them. Differences are theoretically better than ratios because differences should be normally distributed, whereas ratios are not. But ratios are probably still better for our use case.
If Torn 5 does not have hit data (because this is Laserforce data, or because this is a Torn 4 file), you'll have to look at the score ratio instead. This is calculated in exactly the same way as tag ratio. Score ratio isn't as good as tag ratio, because we're interested here in how good the pack is at tagging other packs versus how good it is at getting tagged, but if you don't have tag data it's a reasonable proxy.
You'll see t values and p values. The t value is how many standard deviations this pack is from the mean. Look at the p value — when this is very small, there's a high chance that this pack is "good" or "bad". Any p value greater than 0.01 can be ignored — it's likely due to change, or to that pack being a favourite of particular players, etc. (You often see a level of p < 0.05 being used, but this is only appropriate when we're testing a single variable. Here we're testing one variable for each pack. The description at the bottom of the report offers a conservative p value threshold for the number of packs shown.)
Very small p values will be highlighted in red. These packs are of concern — a "good" pack might have some faulty sensors; a "bad" pack might have weak IR, etc.
If pack hardware has been re-arranged (e.g. you've swapped guns between packs) or renumbered midway through data collection (e.g. you re-ID'ed packs to prevent players from picking favourites), these things will of course limit data quality.
You can try different chart options, set date ranges, etc. — on the Reports toolbar click Customise, add a Pack Report, and choose options.
If you label Round Robin games as Roud Robin, and/or Round 1 games as Round 1, Torn 5 will use only those games for deciding how "good" players are.
Torn 5 can be downloaded from my Apps page. The source code is available from my GitHub page.


Array#combination takes one argument (the number of things you'd like to combine at a time) and returns an Enumerator.
a = [1, 2, 3] => [1, 2, 3] a.combination(2) => #<Enumerator: [1, 2, 3]:combination(2)>
You can call conversions on an Enumerator. The most common of these is #to_a. That will give you an array containing arrays of the length specified by the argument.
a.combination(2).to_a => [[1, 2], [1, 3], [2, 3]]
Like pretty much everything in Ruby, you can save #combination's returned Enumerator into a variable, then call an array conversion on that variable. (You could also save a.combination(2).to_a into a variable, because Ruby doesn't discriminate.)
b = a.combination(2) => #<Enumerator: [1, 2, 3]:combination(2)> b.to_a [[1, 2], [1, 3], [2, 3]]
If you pass an argument to #combination that is higher than the array's length, it will return an empty array (once #to_a is called) because there are no combinations of that length. Likewise, if you pass an argument of 0, it will return an array housing an empty array.
a.combination(4).to_a => [] a.combination(0).to_a => [[]]
#combination.to_a might be most useful when you need to create unique groups, like in the accountability group creator challenge this week.
Array#combination's sister is Array#permutation. #permutation, like #combination, returns an Enumerator when called without a converter, and an array of permutated arrays when called with #to_a.
a = [1, 2, 3] a.permutation(2) => #<Enumerator: [1, 2, 3]:permutation(2)> a.permutation(2).to_a => [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
The biggest difference between #combination and #permutation is #permutation doesn't ignore matching pairs.As you can see, #permutation here returns twice the number of arrays as #combination. Some of the arrays have matching values. #combination would treat [1,2] and [2,1] as redundant, but #permutation doesn't hate that hard. It finds uniqueness in the value positon rather than the actual value.
When faced with arguments higher than the array's length or equaling zero, #permutation reacts exactly the same way as #combination.
a.permutation(4).to_a => [] a.permutation(0).to_a => [[]]
Those both contain no elements because:
#permutation.to_a is most useful when you need to prioritize element position over the element's existence.
You can also call #to_h, creating a hash.
a.permutation(2).to_h => {1=>3, 2=>3, 3=>2} a.combination(2).to_h => {1=>3, 2=>3}
#combination and #permutation are less useful when converting to a hash. They can only be called with an argument of 2 and return less combinations and permutations than the array. There may be some good uses for a hash created this way, but they escape me!
Maybe later versions of Ruby will automatically return an array when #combination and #permutation are used, but for now, don't forget to use #to_a!
8.10.2014


COVID-19 ESTMATOR APP
Enter total Population
Enter Elapse Time
Enter number of Reported Cases
Enter Total number of Hospital Beds
Select Period Type
days
weeks
months
Submit Data


--- layout: post title: Interview with Mind Candy date: 2006-10-20 00:00:00 categories: business digital-media play social ---
Interview with Mind Candy: "Our main aim with this card was to undermine the majority of encryption systems used worldwide. This way, we could covertly divert massive funds to our Swiss bank account."


Carter
This page contains an index of all the individuals in the database with the surname of Carter. Selecting the person’s name will take you to that person’s individual page.
| Given Name | Birth | Death | Partner | Parents |
|---|---|---|---|---|
| Ann | Emmott, George | |||
| Leonard James | 1922-11-16 | 2002-07-10 | Ashcroft, Letty Amelia | Carter, Wilfred Goodman, Elsie "Ina" |
| Rebecca | 1858 | 1882 | Bunter, Albert | |
| Roslyn | 1967-10-06 | Findlay, [Living] | Carter, Leonard James Ashcroft, Letty Amelia | |
| Sarah Ann | Underwood, Frederick Charles Benand | |||
| Stanley H. | ||||
| Wilfred | 1903-08-04 | 1964 | Goodman, Elsie “Ina” | |
| [Living] | Bongers, [Living] | Carter, Stanley H. | ||
| [Living] | Carter, [Living] Seaman, [Living] | |||
| [Living] | Dunlop, [Living] | Carter, [Living] Bongers, [Living] | ||
| [Living] | Carter, [Living] Hopgood, [Living] | |||
| [Living] | Carter, [Living] Hopgood, [Living] | |||
| [Living] | Hopgood, [Living] | Carter, [Living] Bongers, [Living] | ||
| [Living] | Seaman, [Living] | Carter, [Living] Bongers, [Living] | ||
| [Living] | Ellis, [Living] | Carter, Leonard James Ashcroft, Letty Amelia | ||
| [Living] | Carter, [Living] Ellis, [Living] | |||
| [Living] | Marsh, [Living] | Carter, Leonard James Ashcroft, Letty Amelia | ||
| [Living] | Carter, [Living] Ellis, [Living] | |||
| [Living] | Carter, [Living] Ellis, [Living] | |||
| [Living] | Carter, [Living] Schofield, [Living] | |||
| [Living] | Carter, [Living] Schofield, [Living] | |||
| [Living] | ||||
| [Living] | Schofield, [Living] | Carter, [Living] |


Match the computers score. There are four crystals below with hidden values.
Click any crystal to begin!


{% extends "base.html" %} {% load crispy_forms_tags %} {% block title %}Reset Password{% endblock %} {% block header %}
Please specify the email address you registered with your account to receive instructions for resetting your password.
{% endblock %}


CHAPTER 605
ATTORNEYS
Section
605-1 Attorneys, qualifications
605-2 Attorneys; license required
605-3, 4 Repealed
605-5 License fee
605-6 Rules
605-7 Control of action; power to settle
605-8 Practice in all courts; fees
605-9 to 12 Repealed
605-13 District courts, cases involving military vehicles
605-14 Unauthorized practice of law prohibited
605-15 Venue
605-15.1 Standing
605-15.2 Remedies
605-16 Judicial powers not affected
605-17 Penalties
Note
Chapter heading amended by L 1972, c 184, §1(k).
Law Journals and Reviews
The Hawaii Law on Legal Malpractice and Liability to Non-Clients. 13 HBJ, no. 13, at 41 (2009).
Pitfalls in the Collaboration of Attorneys and Expert Witnesses. 13 HBJ, no. 13, at 173 (2009).
Becoming a "Dementia-Capable" Attorney -- Representing Individuals with Dementia. 18 HBJ, no. 13, at 1 (2015).
IOLTA in the New Millenium: Slowly Sinking Under the Weight of the Takings Clause. 23 UH L. Rev. 221 (2000).
Electronic Discovery: A Call for a New Rules Regime for the Hawaii Courts. 32 UH L. Rev. 153 (2009).
Law Firms Competing on the "Edge of Chaos": Pro Bono's Role in a Winning Competitive Strategy. 35 UH L. Rev. 345 (2013).


The cheet, where you going to
The cheet, where you going to
The cheet, where you going to
The cheet, where you going to
IF YOU GIVE ME A CHANCE!
This is a video caption for home star cause it's awesome.


About
Hi! I'm Eliza Brock. Or, at least I was! I'm married now and about 15 years older than I was when the information on this website was last current.
This site is a sample portfolio project that I'm making to show my students (Sophmore CS majors) how to make their own portfolio websites and how to give them some pizzaz and personality. You can check out the Portfolio page to see how this project progresses from simple semantic markup into a completed portfolio website.
If this was my actual website, I'd definitely put more information about me here. The about page is a great opportunity to show readers that you're a real person that they should get to know better, and not some unfeeling robot!


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.lwjgl.opengles.NVCoverageSample
public final class NVCoverageSample
| Field Summary | |
|---|---|
static int |
EGL_COVERAGE_BUFFERS_NV
Accepted by the <attrib_list> parameter of eglChooseConfig and eglCreatePbufferSurface, and by the <attribute> parameter of eglGetConfigAttrib: |
static int |
EGL_COVERAGE_SAMPLES_NV
Accepted by the <attrib_list> parameter of eglChooseConfig and eglCreatePbufferSurface, and by the <attribute> parameter of eglGetConfigAttrib: |
static int |
GL_COVERAGE_ALL_FRAGMENTS_NV
Accepted by the <operation> parameter of CoverageOperationNV: |
static int |
GL_COVERAGE_ATTACHMENT_NV
Accepted by the <attachment> parameter of FramebufferRenderbuffer, and GetFramebufferAttachmentParameteriv: |
static int |
GL_COVERAGE_AUTOMATIC_NV
Accepted by the <operation> parameter of CoverageOperationNV: |
static int |
GL_COVERAGE_BUFFER_BIT_NV
Accepted by the <buf> parameter of Clear: |
static int |
GL_COVERAGE_BUFFERS_NV
Accepted by the <pname> parameter of GetIntegerv: |
static int |
GL_COVERAGE_COMPONENT_NV
Accepted by the <internalformat> parameter of RenderbufferStorageEXT and the <format> parameter of ReadPixels: |
static int |
GL_COVERAGE_COMPONENT4_NV
Accepted by the <internalformat> parameter of RenderbufferStorageEXT: |
static int |
GL_COVERAGE_EDGE_FRAGMENTS_NV
Accepted by the <operation> parameter of CoverageOperationNV: |
static int |
GL_COVERAGE_SAMPLES_NV
Accepted by the <pname> parameter of GetIntegerv: |
| Method Summary | |
|---|---|
static void |
glCoverageMaskNV(boolean mask)
|
static void |
glCoverageOperationNV(int operation)
|
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final int EGL_COVERAGE_BUFFERS_NV
public static final int EGL_COVERAGE_SAMPLES_NV
public static final int GL_COVERAGE_COMPONENT_NV
public static final int GL_COVERAGE_COMPONENT4_NV
public static final int GL_COVERAGE_ALL_FRAGMENTS_NV
public static final int GL_COVERAGE_EDGE_FRAGMENTS_NV
public static final int GL_COVERAGE_AUTOMATIC_NV
public static final int GL_COVERAGE_ATTACHMENT_NV
public static final int GL_COVERAGE_BUFFER_BIT_NV
public static final int GL_COVERAGE_BUFFERS_NV
public static final int GL_COVERAGE_SAMPLES_NV
| Method Detail |
|---|
public static void glCoverageMaskNV(boolean mask)
public static void glCoverageOperationNV(int operation)
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


--- layout: post title: Preview: The SQLite Llibrary as a .NET assembly date: 2021-01-19 12:00:00 keywords: llvm dotnet front sqlite llama teaser: A preview release of SQLite compiled for .NET with Llama ---
The latest pre-release of SQLitePCLRaw contains a new bundle package called SQLitePCLRaw.bundle_cil. This package is like SQLitePCLRaw's other "bundle" packages except that it involves no P/Invoke and no platform-specific shared libraries. Instead, bundle_cil provides the SQLite library as a pure .NET assembly which was compiled by Llama.
A toolchain for compiling "other languages" for .NET
My side project
Llama includes a compiler that translates LLVM bitcode into CIL (Common Intermediate Language), aka MSIL, aka the instruction set of .NET assemblies.
For a bit more info on Llama, see my other blog posts.
I compiled sqlite3.c
with clang, just as one normally would, except I added the -emit-llvm
flag to make it generate bitcode instead of the usual .o/.obj file.
Then I run Llama's compiler on sqlite3.bc
, which results in sqlite3.dll
, a .NET assembly. I also needed to provide various dependencies (handwave, handwave).
Sorry, no, Llama isn't "ready" yet. I've included bundle_cil in this 2.0.5 pre-release so folks can see my progress, but it will be excluded when I release 2.0.5 final. Hopefully bundle_cil will graduate later.
Llama is still at "proof of concept" stage. Lots of things are broken or incomplete.
Quite well. The reason for this pre-release and blog entry is that Llama just passed a big milestone:
The CIL build of SQLite now passes all of the following:
the test cases for SQLitePCLRaw
the 600+ test cases for Microsoft.Data.Sqlite
the 22,000+ SQLite test cases for Entity Framework Core (in EFCore.Sqlite.FunctionalTests)
... on Windows. On Linux, things are close but not quite there yet. I haven't tried on Mac yet.
Currently, Llama only works with .NET 5.0.
I haven't done any actual benchmarks. I assume that things are at least a little bit slower. I see lots of places where I know I could improve performance. I believe that Llama-compiled code will (eventually) be competitive on performance, but I currently have no evidence or measurements to support that belief.
SQLitePCLRaw uses an architecture wherein the details of the integration with the native SQLite library are encapsulated inside a "provider".
For the CIL build of SQLite, I added a new provider.
It simply calls stuff in the sqlite3.dll
assembly
instead of using P/Invoke.
Nothing in SQLitePCLRaw above the provider API boundary had to be changed, so bundle_cil can be a drop-in replacement for bundle_e_sqlite3.
That is certainly the goal.
In some ways, SQLite is much easier than other libraries. It is an incredibly high quality project and it is very cross-platform.
Also, SQLite is provided as an "amalgamation", a single C source file that contains the entire library. In this case, the easiest build system is no build system at all. As I've explored building other C-language projects with Llama, getting their build system to create an LLVM bitcode file is one of the trickiest parts.
OTOH, SQLite offers its own challenges. It has minimal dependencies, but those do include some very tricky things such as shared memory, thread synchronization primitives, and file locking.
No, I hope to get Llama working for several other languages which have LLVM-based compilers. Llama's support for Rust is actually a bit further along than C. I am eager to try and get Llama working with Swift.
I don't like the name, but I haven't thought of anything better yet.
If you are using SQLitePCLRaw or some other wrapped that is built on same (such as sqlite-net or Microsoft.Data.Sqlite or Entity Framework Core), you just need to replace your bundle_e_sqlite3 package reference with bundle_cil, and set the version to the pre-release:
<PackageReference Include="SQLitePCLRaw.bundle_cil" Version="2.0.5-pre20210119130047" />
If you do give this a try, please let me know how it goes.


Argus is a system which can be used to do various eye vision tests, and see if your eyes are healthy.
About:
Vision is out most dominant sense and account for a majority of our sensory information.
But a lot of people suffer from undiagnosed optical disorders, especially myopia (Nearsightedness).
It is expected that by 2050, 50% of the world's population, a total of nearly 5 billion, will suffer from myopia.
Thus, eye healthcare is of utmost importance in developing countries like India. We have sought to develop a web-application to facilitate the process of eye-checkup.
This app targets those people who have connection to the internet but cannot visit eye clinics due to affordability, remoteness etc.


class: center, middle # Fast Deterministic Incremental Build --- # Build Challenges - Large volumn + frequent change - Incremental build to help - Incremental build is conceptually a different pipeline than full build - Diff with last build - Hard to garrentee same result as full build - Diverse languages: C#, Javascript, Python, Ruby ... - Incremental only lightup for some part of C# build step - CI written in a different language just to transform data between repos - Fixed proprietary backend (OPS) - Reinvent CI: source control management, Github integration, build scheduler, email notification... - Unable to run on other backends like VSTS, AppVeyor, Travis, Jeckins... --- # {Fast + Correct} Choose two Inspired by: - [Bazel](https://bazel.build) - [Domino Build](https://www.1eswiki.com/wiki/Domino) --- # Ideas - Pure function - The function always evaluates the same output given the same input - The function output cannot depend on any hidden state including I/O - Evaluation of the output does not cause any observable side effect - Pure function cache - Maps input hash to output hash - Use the cached output hash for the same set of input hash --- # {Fast + Correct} Choose two Fast - Incremental build everywhere Correct - No diffing - Incremental builds are conceptually the same as full build, and virtually always correct, it's not necessary to run a clean build "just in case" to ensure correctness --- # Why NOT Bazel or Domino - Smallest build step is a process - We typically have a single process processing huge amount of files - Platform limitations - Bazel lacks windows support - Domino is internal only - Not containerized - See [why containers]() later - Fun --- ### {Fast + Correct + **Cross Language**} Choose three - Build steps modeled as *stateless* HTTP API call - Build steps written in *best fit* language: - Ruby for shopify/liquid - Python for pydoc - Javascript for jsdoc - Build orchestrator - Coordinate build steps - Cache build result and perform incremental build - Scriptable using `javascript` - Deployed as *Docker Container* - Run build locally with reliable reproducability - Run build on any docker enabled CI platform (VSTS, AppVeyor...) - Strong versioning: simple and always up to date --- ### {Fast + Correct + **Cross Language**} Choose three Why HTTP and Containers? - Approaches to incremental build: - Build a library for each supported language - *O(N)* - Build a C libary and provide binding for each supported language - *1 + O(N)* - Build an orchestrator and let libraries talk to each other `✓` - *1 + O(N)* - The orchestrator can be written in *any* language - Most languages can start a simple HTTP server in several lines of code - Container solve the problem of framework installation, deployment, update, reproducability... --- # Sample Services - Markdown Service in C# - `render_markdown(markdown) -> html` - `extract_yaml_header(markdown) -> metadata` - Liquid Service in Ruby - `apply_liquid(html, metadata) -> templated_html` Orchestrator Build Script ``` javascript for (var md in glob('/src/**/*.md')) { var html = render_markdown(md) var metadata = extract_yaml_header(md) var templated_html = apply_liquid(html, metadata) output(`/dist/${md.name}.html`, templated_html) } ``` --- # Sample ``` javascript for (var md in glob('/src/**/*.md')) { var html = render_markdown(md) var metadata = extract_yaml_header(md) var templated_html = apply_liquid(html, metadata) output(`/dist/${md.name}.html`, templated_html) } ``` - On cache hit: `html`, `metadata`, `templated_html` are all hashes. Loop body is optimized to 3 cache lookups and a cache content copy. All unchanged content fall in this category. - On cache miss: `render_markdown`, `extract_yaml_header`, `apply_liquid` calls the corresponding service through HTTP API. - In case `render_markdown` and `extract_yaml_header` produces results already in the case, `apply_liquid` becomes cache lookup. E.g. adding a newline to markdown that does not affect output html --- class: center middle # Q & A


Solder Mask Optimization is a read-write DFM action designed to increase yield by providing optimal clearances and optimal coverage wherever possible, and compromising only in dense places. It maintains clearances and coverage throughout the layer while keeping within the guidelines of the specified parameters.
The action enables modification of the solder mask layer to achieve manufacturing goals. ERF parameters and their definitions must be well understood in order to customize this action.
This action may be used on external signal layers and solder paste layers. Negative layers are inverted before processing. Drill layers passing through the signal layer and soldermask layers are referenced. Solder Mask Optimization has two operation modes:
* Create Soldermask from scratch.
* Improve existing Soldermask.
The following are the functions of the Solder Mask Optimization algorithm:
*
To provide optimal clearance for each pad.
*
For all over-exposed conductors (large
soldermask opening), to increase coverage by shaving away a portion of the
soldermask pad that is closest to the conductor, or by decreasing the size of
soldermask clearance.
*
For adjacent pads from different nets, to
provide a separating wall - a bridge (spacing between two SMD clearances) over
a hole in the soldermask cover.
A soldermask wall that separates two signal layer pads. Usually represented by a negative line placed over two adjacent pads.
A negative line placed over a pad to increase cover for a conductor.
Can be a via, NPTH, SMD or fiducial feature, as derived from the feature's attribute, or the hole type drilled through the feature.
A positive line joining two soldermask clearances.
A violation is a relation between a signal layer feature and a soldermask feature that is not maintained according to design rules. For example, a clearance/space violation means that the space around the pad is less than that prescribed in the relevant parameter.
We can process each clearance as a Simple Oversized clearance.
Histograms for all categories are produced.
The following attributes are produced once for each layer.
|
Attribute |
Description |
|
...Opt_Both |
Violations (Optimal) |
|
...Min_Both |
Violations (Minimal) |
|
...Bridges |
Bridges (All) |
|
...Opt_Cover |
Opt.Cover Only |
|
...Opt_Clear |
Opt.Clear Only |
|
...Too_Dense |
Too dense |
|
...Too_Tight |
Problems |
|
...Min_Bridge |
Bridges (Violations) |
|
...Large_Clears |
Oversized Clearances |
|
...Partials |
Partial Clearances |
|
...Small_Clears |
Small Clearances |
|
...Bridges_Pos |
Bridges (Positive) |
|
...Cannot_Bridge |
Count all deleted Bridges |
|
...Shaves |
Count all Shaves |
The essence of Solder Mask Optimization is the search for a best possible compromise between two opposing requirements:
1.
To provide
sufficient clearance from soldermask for pads
2.
To provide sufficient
soldermask coverage for conductors
In the best case, pads in external layers are far enough from conductors and from other nets. It is possible to specify wide clearances and still maintain a safe distance from the borders of the pads to neighboring conductors. But in more densely populated boards this is not the case: conductors are very close to pads and it is impossible to provide both the best possible coverage and the best possible clearance. Obviously, some kind of compromise between those two requirements must be reached.
Assume the following definitions:
opt_clear - optimal clearance
min_clear - minimum acceptable clearance
opt_cover - optimal cover
min_cover - minimum acceptable cover.
Dist - distance between conductors that should stay covered and the shape which should be cleared.
All opt_clear,min_clear,opt_cover,min_cover are derived from corresponding parameters or from relevant range values.
Cover to Clearance compromise is solved differently for three cases, as follows:
1. opt_clear +
opt_cover <= dist
Both clearance and cover will be optimal.
2. opt_clear + opt_cover > dist, but min_clear + min_cover < dist
Compromise may be reached without violating min_clear, min_cover .
If this value violates one of the minimums it is forced to the corresponding minimal value.
3. min_clear + min_cover > dist
The compromise will be reached according to the v_compromise variable in the following way:
Starting from Software Version 2.0, the pad_to_drill_type dependency was limited to the following ERF variables:
* v_enlarge_pth
* v_enlarge_npth
* v_enlarge_via
They define how much the corresponding clearance should be enlarged or reduced. If the resulting clearance radius is less than zero, no clearance will be produced.
We have added ranges of soldermask parameters according to pad type and drill type. Four different range types will be maintained:
* SMD ranges
* VIA ranges
* PTH ranges
* NPTH ranges.
A range definition includes its borders definition and a set of range parameters (values to control the Solder Mask Optimization process in this range).
The following restrictions will be applied to range definitions:
* Maximum of 10 ranges can
be defined for each type.
* Range borders should not
overlap.
* Range parameter
definition without corresponding range borders definition is invalid and
ignored.
* SMD ranges are
classified according to the spacing between SMD pads of the same row (pitch - pad
size) and VIA, PTH, NPTH ranges according to Annular Ring (distance to the
closest signal layer feature).
For each range, the user may define how the range is partitioned between minimal clearance, optimal clearance, minimal coverage, and optimal coverage.
Also, a bridge value may be supplied for every range type. Ranges are numbered from 1 to 10 and three variables are defined for each range.
For example, for range number 1 which covers SMD pads with pitches from 2 to 5 mils, the following ERF variables may be supplied:
-
# range number 1 covers pitches from 2 to 5 mils
-
SMD_1_BORDERS = 2:5
-
# min clearance is set to 20% of the spacing between SMD pads
-
# opt clearance is set to 60% of the spacing between SMD pads
-
# min coverage is set to 30% of the spacing between SMD pads
-
# opt coverage is set to 40% of the spacing between SMD pads
-
SMD_1_PARTITION = 0.2:0.6 0.3:0.4
-
# Bridge between SMD-features is 20% of the spacing between SMD
pads
-
# in the row.
-
SMD_1_BRIDGE = 0.2
For range 2, which covers SMD pads with pitches from 7 to 15 mils, the following ERF-variables may be supplied:
-
# range number 1 covers pitches from 2 to 5 mils
-
SMD_2_BORDERS = 7:15
-
# min clearance is set to 10% of the spacing between SMD pads
-
# opt clearance is set to 40% of the spacing between SMD pads
-
# min coverage is set to 30% of the spacing between SMD pads
-
# opt coverage is set to 10% of the spacing between SMD pads
-
SMD_2_PARTITION = 0.1:0.4 0.3:0.1
-
# Bridge between smd-features is 10% of the spacing between smd
pads
-
# in the row.
-
SMD_2_BRIDGE = 0.1
Ranges for other types are defined in the same way.
VIA_<x>_BORDERS =
<from>:<to>
VIA_<x>_PARTITION = <min
clearance>:<opt clearance> <min coverage>:<opt coverage>
VIA_<x>_BRIDGE = <bridge>
PTH_<x>_BORDERS =
<from>:<to>
PTH_<x>_PARTITION = <min
clearance>:<opt clearance> <min coverage>:<opt coverage>
PTH_<x>_BRIDGE = <bridge>
NPTH_<x>_BORDERS =
<from>:<to>
NPTH_<x>_PARTITION = <min
clearance>:<opt clearance> <min coverage>:<opt coverage>
NPTH_<x>_BRIDGE = <bridge>
Where <x> may be 1,2,.... 10 and stand for any range number.
Note:
Any Annular ring value (or spacing value for SMDs) not covered by one of the
ranges is treated according to the usual set of parameters:
pp_minimal_clearance
pp_optimal_clearance
pp_minimal_coverage
pp_optimal_coverage
pp_bridge.
If no ranges are defined, the Soldermask Mask Opt action functions exactly in the same manner as before.
For each clearance and pad type, default settings may be defined:
NPTH_BRIDGE = <bridge >
NPTH_PARTITION = <min
clearance>:<opt clearance> <min coverage>:<opt coverage> will supply data in case only borders are defined for
the range.
Additional details:
* Delimiter may be any one
of: , , ; :.
* <min clearance> <= <opt clearance>
* <min coverage> <= <opt coverage>
* Only <min coverage> may be supplied in <XXXXX>_PARTITION statements.
* <opt coverage> and <opt
clearance> may be more than 1.
The following defaults are used:
*
If < opt clearance > is missing in the <XXXXX>_PARTITION statement, <opt clearance > is set to <min clearance>
*
If <min
coverage> is missing in the <XXXXX>_PARTITION statement, <min coverage> is set to 1 - <opt clearance>
*
If <opt
coverage> is missing in the <XXXXX>_PARTITION statement
<opt coverage > is set to <min clearance>


Puducherry’s Paradise Beach declared ‘no plastic’ zone
District Collector T. Arun issues order; move made to protect marine ecology
by Special CorrespondentThe government has declared the famous and pristine Paradise Beach near Chunnambar boathouse a ‘no plastic’ zone.
District Collector T. Arun in an order on Monday directed Managing Director of Pondicherry Tourism Development Corporation to restrict the use and sale of plastic items. The beach has become one of the most sough- after tourist spots in the Union Territory.
The increasing use of plastic on the beach has become a threat to marine ecology, besides affecting the aesthetic environment of the surrounding, the order said. “It is pertinent to mention that the plastic waste getting into the sea cause disturbing impact on marine species and animals. The entire marine ecology is highly susceptible to plastic waste and thereby prompting preventive action.” Mr Arun said.
Any person found violating the order will be prosecuted under section 188 of the Indian Penal Code, he said in the order.


--- title: "The Bay Area's Five Star Sound" date: 2019-10-29T10:20:51-07:00 ---
I signed up to get Dan Kopf’s “Golden Stats Warrior” newsletter, a newsletter that provides data driven insight into the Bay Area. You can sign up too here.
The last edition looked at the greatest albums from the Bay Area. Of albums by Bay Area natives, which ones got five stars on AllMusic? Being a bit of a music nerd, I wanted to dig in further. Kopf was kind enough to share the data with me so that I could do some more exploring.
I decided to use the Spotify API to get audio features for all of the songs on these albums. Then we can see if there is a quintessential Bay Area sound.
library(dplyr)
library(spotifyr)
library(purrr)
library(lubridate)
library(ggplot2)
library(ggradar)
library(kableExtra)
library(scales)
spotify_client_id="" ## put yours here
spotify_client_secret="" ## put yours here
access_token <- get_spotify_access_token(client_id=spotify_client_id,client_secret=spotify_client_secret)
setwd("~/Desktop/freelance/goldenStatWarrior")
data <- read.csv("BayAreaAlbums-datafromletter3.csv", stringsAsFactors = F)
greatest <- subset(data, Score == 5)
First we grab the audio features for any album by the Bay Area artists who scored a five on at least one album.
helper <- function(x) {
get_artist_audio_features(x, include_groups = "album", authorization = access_token)
}
safe_spotify <- safely(helper) ## don't want it to crash if there is a bad request
allInfoGreatest <- unique(greatest$Artist.Name) %>% map(safe_spotify)
save(allInfoGreatest, file = "allInfoGreatest.RData")
testSly <- helper("family stone") ## Sly & the Family Stone gets weird, so do them seperately
Then we clean that up a bit.
load(file = "allInfoGreatest.RData")
clean <- lapply(allInfoGreatest, function(x) {
x$result
})
clean2 <- do.call("rbind", clean)
clean2$album_release_date <- as.Date(clean2$album_release_date)
clean2$year <- year(clean2$album_release_date)
testSly$album_release_date <- as.Date(testSly$album_release_date)
testSly$year <- year(testSly$album_release_date)
clean3 <- rbind(clean2, testSly)
save(clean3, file = "clean3.RData")
Now we get things prepped for merging based on names. This could get ugly.
setwd("~/Desktop/freelance/goldenStatWarrior")
load(file="clean3.RData")
greatest$Artist.Name=tolower(greatest$Artist.Name)
greatest$Album.Name=tolower(greatest$Album.Name)
clean3$album_name=tolower(clean3$album_name)
clean3$artist_name=tolower(clean3$artist_name)
Inevitably, it did. These were the ones where I had to do some manual fudging to get things right.
greatest$Album.Name[which(greatest$Album.Name == "handel: messiah [2008 recording]")] <- "handel: messiah"
greatest$Artist.Name[which(greatest$Artist.Name == "dave brubeck")] <- "the dave brubeck quartet"
greatest$Album.Name[which(greatest$Album.Name == "lorraine at emmanuel")] <- "lorraine hunt lieberson at emmanuel"
greatest$Album.Name[which(greatest$Album.Name == "recital: lorraine hunt lieberson at ravinia")] <- "recital at ravinia"
greatest$Album.Name[which(greatest$Album.Name == "red house painters (roller-coaster)")] <- "red house painters i"
greatest$Album.Name[which(greatest$Album.Name == "john adams: harmonielehre; short ride in a fast machine")] <- "adams: harmonielehre - short ride in a fast machine"
greatest$Artist.Name[which(greatest$Artist.Name == "vince guaraldi")] <- "vince guaraldi trio"
greatest$Album.Name[which(greatest$Album.Name == "cast your fate to the wind: jazz impressions of black orpheus")] <- "cast your fate to the wind"
greatest$Album.Name[which(greatest$Album.Name == "a boy named charlie brown [original soundtrack]")] <- "a boy named charlie brown"
greatest2 <- rbind.data.frame(greatest, greatest[which(greatest$Album.Name == "cast your fate to the wind"), ])
greatest2$Album.Name[nrow(greatest2)] <- "jazz impressions of black orpheus" ## split into two on Spotify
Actually do the matching.
helper <- function(x) {
use <- greatest2[x, c("Album.Name", "Artist.Name", "Year")]
test <- subset(clean3, artist_name == use$Artist.Name)
toReturn <- test[agrep(use$Album.Name, test$album_name), ] ## sort of fuzzy match
return(toReturn)
}
getData <- lapply(1:nrow(greatest2), helper)
test <- lapply(getData, nrow)
Which ones didn’t work out?
tt = greatest[which(unlist(test)==0),]
kable(tt) %>% kable_styling()
| Artist.URL | Year | City | Artist.Name | Score | Album.Name | |
|---|---|---|---|---|---|---|
| 658 | /artist/marty-paich-mn0000858709 | 1956 | Oakland | marty paich | 5 | sings fred astaire |
| 933 | /artist/russell-garcia-mn0000808436 | 1958 | Oakland | russell garcia | 5 | fantastica: music from outer space |
| 1032 | /artist/souls-of-mischief-mn0000041857 | 1993 | Oakland | souls of mischief | 5 | 93 ’til infinity |
| 1225 | /artist/tony%21-toni%21-ton%C3%A9%21-mn0000790667 | 1990 | Oakland | tony! toni! toné! | 5 | the revival |
| 1457 | /artist/david-murray-mn0000182855 | 1982 | Berkeley | david murray | 5 | murray’s steps |
| 2043 | /artist/los-tigres-del-norte-mn0000806336 | 1989 | San Jose | los tigres del norte | 5 | triunfo solido |
| 2294 | /artist/andra%C3%A9-crouch-mn0000031263 | 1978 | San Francisco | andraé crouch | 5 | andrae crouch & the disciples |
| 2453 | /artist/big-brother-the-holding-company-mn0000758943 | 1968 | San Francisco | big brother & the holding company | 5 | cheap thrills |
| 2791 | /artist/constantine-orbelian-mn0000937363 | 2017 | San Francisco | constantine orbelian | 5 | georgy sviridov: russia cast adrift |
| 2910 | /artist/del-sol-string-quartet-mn0000335603 | 2009 | San Francisco | del sol string quartet | 5 | marc blitzstein: first life - rare early works |
| 3518 | /artist/jeannette-sorrell-mn0001286718 | 2011 | San Francisco | jeannette sorrell | 5 | come to the river: an early american gathering |
| 4520 | /artist/leon-fleisher-mn0001209232 | 2009 | San Francisco | leon fleisher | 5 | hindemith: klaviermusik mit orchester; dvorák: symphony no. 9 “from the new world” |
| 4588 | /artist/linda-tillery-mn0000594698 | 1993 | San Francisco | linda tillery | 5 | secrets |
| 4635 | /artist/lorraine-hunt-lieberson-mn0001472476 | 2007 | San Francisco | lorraine hunt lieberson | 5 | songs by mahler, handel & peter lieberson |
| 5492 | /artist/ruggiero-ricci-mn0000249876 | 1985 | San Francisco | ruggiero ricci | 5 | franck: violin sonata; prokofiev: violin sonata op. 94a |
| 6281 | /artist/vince-guaraldi-mn0000201678 | 1966 | San Francisco | vince guaraldi trio | 5 | it’s the great pumpkin, charlie brown |
I checked, and this wasn’t just an issue of merging on slightly different names. I couldn’t find the analogue in the albums pulled from Spotify based on the artist names. We only lost 16 out of 56, not bad!
dataINeed=do.call("rbind",getData)
save(dataINeed,file = "fullData2018-10-28.RData")
Now we get to the fun stuff. What kind of features do we have? We want to get the average and variability across songs, per album.
characteristics <- c("danceability", "energy", "loudness", "speechiness", "acousticness", "instrumentalness", "liveness", "valence")
charSum <- dataINeed[, c(characteristics, "album_name")] %>%
group_by(album_name) %>%
summarise(
meanDanceability = mean(danceability), meanEnergy = mean(energy),
meanLoudness = mean(loudness), meanSpeechiness = mean(speechiness),
meanAcousticness = mean(acousticness), meanInstrumentalness = mean(instrumentalness), meanLiveness = mean(liveness), meanValence = mean(valence),
varDanceability = var(danceability), varEnergy = var(energy),
varLoudness = var(loudness), varSpeechiness = var(speechiness),
varAcousticness = var(acousticness), varInstrumentalness = var(instrumentalness), varLiveness = var(liveness), varValence = var(valence)
)
## add mean of everything in black
add <- cbind.data.frame(album_name = "avg", t(apply(dataINeed[, c(characteristics)], 2, mean)))
meanStuff <- charSum[, 1:9]
names(add) <- names(meanStuff)
meanStuff <- rbind.data.frame(meanStuff, add)
varStuff <- charSum[, c(1, 10:17)]
Now, I wanted to make some cool radar plots, inspired by music analysis like this. You can also find descriptions of the features there.
Of course there is a gg
version, but I had to tweak the internal functionality to get the plots to look like what I wanted them to. This gets a bit gnarly, so I’m compartmentalizing that code over here.
setwd("~/Desktop/freelance/goldenStatWarrior")
source("fix_ggradar.R")
I also snagged some code from the internal ggradar
so that I could add a line representing the average across all albums in black. That stuff lives in the following helper function.
helperPlot <- function(base) {
grid.min <- 0 # , # 10,
grid.mid <- 0.5 # , # 50,
grid.max <- 1 # , # 100,
centre.y <- grid.min - ((1 / 9) * (grid.max - grid.min))
plot.data <- as.data.frame(toP[nrow(toP), ])
names(plot.data)[1] <- "group"
if (!is.factor(plot.data[, 1])) {
plot.data[, 1] <- as.factor(as.character(plot.data[, 1]))
}
plot.data.offset <- plot.data
plot.data.offset[, 2:ncol(plot.data)] <- plot.data[, 2:ncol(plot.data)] + abs(centre.y)
# print(plot.data.offset)
# (b) convert into radial coords
group <- NULL
group$path <- CalculateGroupPath(plot.data.offset)
group.line.width <- 1.5
group.point.size <- 6
# ... + group (cluster) 'paths'
base <- base + geom_path(
data = group$path, aes(x = x, y = y, group = group),
size = group.line.width, lty = 2, col = "black"
)
# ... + group points (cluster data)
base <- base + geom_point(data = group$path, aes(x = x, y = y, group = group), size = group.point.size, alpha = 0.5, col = "black")
return(base)
}
Acousticness for the win! However, there are quite a few albums that hit high instrumentalness (makes sense, lots of jazz and classical music), high energy, danceability (they aren’t called Funky Divas for nothing), and loudness (Green Day, anyone?)
toP <- meanStuff %>% mutate_at(vars(-album_name), rescale)
base <- ggradar2(toP[-nrow(toP), ])
helperPlot(base)
Which album is most like the average five-star Bay Area album? Dave Brubeck’s “Time Out”
This isn’t particularly suprising has Brubeck has the third highest number of albums on the five-star list.
test=as.matrix(dist(toP[,-1]))
#toP[which.min(test[nrow(toP),-ncol(test)]),]
dataINeed %>% group_by(album_id) %>% summarise(count=n(),artist=artist_name[1]) %>% group_by(artist) %>% summarise(count=n()) %>% arrange(desc(count))
## # A tibble: 24 x 2
## artist count
## <chr> <int>
## 1 vince guaraldi trio 9
## 2 lorraine hunt lieberson 8
## 3 the dave brubeck quartet 6
## 4 leon fleisher 5
## 5 moby grape 5
## 6 david murray 3
## 7 san francisco symphony 3
## 8 chanticleer 2
## 9 grateful dead 2
## 10 green day 2
## # … with 14 more rows
The Bay Area likes variability in valence (positivity of sound).
toP = varStuff %>% mutate_at(vars(-album_name), rescale)
base = ggradar2(toP[-nrow(toP),])
helperPlot(base)
Which album has the variability most like the average five-star Bay Area album? The Grateful Dead’s “American Beauty” (from SF)
test=as.matrix(dist(toP[,-1]))
#toP[which.min(test[nrow(toP),-ncol(test)]),]
What about the Bay Area pace? Let’s look at tempo.
ggplot(dataINeed, aes(x=tempo)) + geom_histogram()+xlab("beats per minute")
What song is most like the average tempo? Ironically, Brubeck’s St. Louis Blues. Brubeck is a Concord original.
mean(dataINeed$tempo)
## [1] 111.9667
#dataINeed[which.min(abs(dataINeed$tempo-mean(dataINeed$tempo))),]
blogdown::shortcode("youtube", "tq2YENV_Q9s")
{{% youtube "tq2YENV_Q9s" %}}
But there is a peak in the tempo distribution that is slower than the mean. What song is most like this mode? Gotta love a good cover of The Beatles’ “Yesterday” by Oakland’s En Vogue.
#which.max(table(round(dataINeed$tempo)))
# mode
#dataINeed[which.min(abs(dataINeed$tempo-80)),]
blogdown::shortcode("youtube", "k1PiJAeydLs")
{{% youtube "k1PiJAeydLs" %}}
What about those few faster paced jams? Here is an inspirational song from San Francisco’s Moby Grape.
#dataINeed[which.min(abs(dataINeed$tempo-200)),]
blogdown::shortcode("youtube", "9-RKXCvb5E")
{{% youtube "9-RKXCvb5E" %}}
What is an example of a song that is in the most prominent key? Oakland’s Digital Underground gives us “Doowutchyalike.”
#which.max(table(dataINeed$key_mode))
#dataINeed[which(dataINeed$key_mode=="A major")[1],]
blogdown::shortcode("youtube", "5P4WZHlHsyk")
{{% youtube "5P4WZHlHsyk" %}}
There is plenty more to dig into here.
But those are for another day…
Thanks again to Dan Kopf (@dkopf) for sharing the data! Thoughts, comments, suggestions, etc. welcome –> @sastoudt.