1,066 karma · joined February 12, 2013
I've had in mind an idea to make an open-source album of completely algorithmically generated music using my Python sound synthesis library. Of course I started with the drum parts, got way too deep in trying to make realistic cymbal sounds (which is very hard), and got burnt out. Typical me... Should probably pick that back up!
IdealSpot is looking for a front-end engineer!
IdealSpot brings the power of machine learning to retail site selection. Basically, we work with the massive amount of location-based data sources out there to help businesses find the best place to open a new location.
We're a young startup (less than a year old), but now that we have seed funding, we're looking to scale up our business. We’re building out a large mapping tool to help our customers visualize and interact with our data, and we need a hotshot front-end dev to help. Since we're so early in our development, there's a lot of room to help us work out the architecture, and make a big impact in how our business works.
We would love to find a developer who has at least some experience with UI and UX design. We find that understanding the user experience and flow is very helpful to being able to code the interaction in a way that makes sense to the user. Pixel-level design skills are also very helpful. That said, we expect you to be able to do the following:
* Code in Javascript on one of the popular frameworks (AngularJS, ReactJS, Vue.js)
* Build interactive UIs utilizing real-time data from internal and external REST APIs
* Interact with the Google Maps API
* Build responsive templates in HTML5 and CSS3 (knowledge of Sass is a big plus)
* Work with a team within a shared Git repo - i.e., you should know how to merge your code and not screw everything up
Send us an email at work@idealspot.com if you're interested. Feel free to include any past work you can show us, such as a GitHub profile.
There was in fact a group within Google that worked on this: http://www.cs.toronto.edu/~cmaddis/pubs/deepgo.pdf
IdealSpot is looking for a backend engineer!
IdealSpot brings the power of machine learning to retail site selection. Basically, we work with the massive amount of location-based data sources out there to help businesses find the best place to open a new location.
We're a young startup (less than a year old), but now that we have seed funding, we're looking to scale up our business. We'd like to handle a huge number of data sources, with a huge number of models processing them, providing value to a huge number of businesses. Since we're so early in our development, there's a lot of room to help us work out the architecture, and make a big impact in how our business works.
Most importantly, we are looking for general software engineering skills. You should be able to dive into any problem and understand the interactions between all the different parts of it. You should be able to write clean, maintainable, modular code. That said, we are looking for somebody who can:
* Code in Python (preferably including NumPy/SciPy/Pandas/Scikit-learn)
* Work with "messy" data--scraping websites, working with CSV/JSON/REST APIs, automating cleanup tasks, etc.
* Interact with databases (we use Postgres/PostGIS/Mongo, and more are on the horizon)
* Do some basic sysadmin-type work, including working with Linux, EC2, Docker
If you don't know all of these, (or even if you do!), show us that you can learn quickly. Or even show us what we can use that's better!
Send us an email at work@idealspot.com if you're interested. Feel free to include any past work you can show us, such as a GitHub profile.
There's a lot of overlap with how I want my language Mutagen[1] to work. Merkle trees of syntax, details persistence/communication handled transparently (or at least orthogonally to any other program logic). Where I think this is most important though (and this description of the project doesn't seem to mention) is optimization. Things like database de-/normalization, data locality, and really so much more--pretty much everything engineers do for performance rather than business logic--should be in the hands of the compiler. Mutagen has been on hiatus for a while, but I've been thinking about it a lot more lately, thinking where to go next. If anybody is interested in it, let me know--I'd love some contributors to work with, or even just people interested in optimization/compilers/functional programming to talk to.
$ python3 -mtimeit -s 's="%s %s %s"' 's % (1, 3, 9)'
1000000 loops, best of 3: 0.343 usec per loop
$ python3 -mtimeit -s 'class Spam:pass' 'Spam()'
10000000 loops, best of 3: 0.106 usec per loopMoxie seemed to hint at this problem by mentioning local bitcoin wallets--client-side hashing only makes sense if you're not sending the hash anywhere.
const int main = 0xC3;
...which is just a return. Or you can get fancy and make it exit successfully by clearing eax first: const int main = 0xC3C031;Since we're dealing with whole chickens, there should an integral ratio between the two prices--that is, M expensive chickens should be the same price as N cheap ones. To go from, say, 10 to 16 chickens requires replacing X chickens with X+6 chickens sold later but costing the same in total. Same with 10 to 26 or 16 to 26. The GCD between these differences (6, 10, and 16) is 2, implying N<=M+2. We also know N/M>=2.6, meaning to trade from 10 chickens to 26 you need to get at least 2.6 cheap chickens for every expensive one you replace. So there's only one exchange rate that works: one expensive chicken costs as much as three cheap ones. Using this exchange rate, 8 of the 10 chickens would have to be traded to get 24 out of 26, leaving two chickens for each farmer that were sold for the same total, but at unknown prices. Three possibilities (0, 1, or 2 at the expensive rate) is a pretty easy brute force at that point.
Not too much documentation right now, and there's barely any example usage. Think it's about time to remedy that! I have plans for an open-source album created with it, but it's just an idea at this point.
An additional problem I just thought of, however, is that there will be some number of stakeholders that leave the network, lose their keys, etc., and there is a chance that they are the only ones chosen to sign a given history extension. So there has to be some way to recover from this, while still being resistant to denial-of-service attacks.
...and particularly after seeing this graph: https://blockchain.info/charts/cost-per-transaction
I'm more excited about proof-of-stake, as there isn't this arms race to throw more and more computing power to generate bitcoins. I'm not sure why it hasn't seen more adoption, but I will admit that I don't pay a lot of attention to the cryptocurrency space...
#include <stdio.h>
int main() {
unsigned long long bits = 0x7FFC000000000000;
double x = *(double *)&bits;
bits += 1;
double y = *(double *)&bits;
double z = x + y, w = y + x;
printf("%llx %llx\n", *(unsigned long long *)&z, *(unsigned long long *)&w);
}
Of course, this probably doesn't matter for most applications.> So I agree with this claim - uniform distributions are fairly robust to errors. But I don't think that's particularly related to randomness - Monte Carlo is only needed to integrate the distribution.
Ah, that's an interesting distinction, thanks. I'll have to think about this some more. But given a situation where exact integration is intractable (like chess or Go), I'm not too sure what the difference really is, because it is those cases (on first thought) where the uniform distribution is useful--if you can see to the end, you don't need to care about bias, right? I mean, "randomness" in the strictest sense is not really necessary; all these programs I speak of used deterministic pseudorandom generators of course. It's really just about ensuring lack of bias given finite sampling. I'm happy to hear your take on it though--you definitely seem to have a lot more knowledge of math/statistics/etc. than I do.
(That does remind me of another fascinating tidbit from the Go world: programmers noticed that using a low-quality PRNG, like libc's LCG rand(), produced significantly weaker players than more evenly-distributed PRNGs, even though it would seem that playing lots of random games of indeterminate length (with the PRNG called at least once per move) would not correlate at all with the PRNG's distribution.)
The adversarial-or-not issue is also good food for thought. I'm not convinced that it explains much in this case, though, since I believe most of these observations were made by playing computer-computer games with each program using very similar algorithms, or with old hand-tuned programs against the newer Monte-Carlo based programs.
Choice quote: > As a general principle, on any problem for which you know that a particular unrandomized algorithm is unusually stupid - so that a randomized algorithm seems wiser - you should be able to use the same knowledge to produce a superior derandomized algorithm.
An interesting counterexample to this, an example which to me illustrates a very powerful aspect of randomness, is the monte-carlo revolution in computer Go (AI for the ancient Asian board game). For years, computer progress stagnated, as the techniques were mostly focused on encoding human knowledge into code. While most of this human knowledge is generally correct, it introduces significant bias in the way positions are evaluated. The way these rules-of-thumb interact is very hard to predict, and tree search algorithms are quite good at finding positions that are incorrectly evaluated. Because of this, the worst-case behavior of an evaluation function is much more important than it's best-case or average behavior.
Computers started making lots of progress when a new technique was used: rather than try to evaluate positions by a large set of heuristics, they were evaluated by playing random games. Go positions are quite hard to evaluate from simple rules of thumb, and this random game approach gives a much more balanced, long-term view of positions. And most importantly, there is much less bias.
Obviously, an entirely random game, with a uniform distribution over possible moves, is easy to improve upon. But computer go programmers noticed an interesting phenomenon: while certain types of knowledge incorporated into the random move distribution (to make it "more intelligent", as judged by a human) were helpful, others were not (even after taking into account the computational cost of adding the knowledge), and it wasn't always clear why. The same observation about heuristic evaluation noted above applied: having a balanced distribution of move choices, with a reasonable probabilistic lower bound of effectiveness, is more important than making an intelligent choice that is usually correct, but has unpredictable, extreme worst-case performance.
So we see that randomness does have an important property: it avoids the downside of "knowledge" that generally seems correct but can go horribly wrong in unexpected ways.
I don't know of a good writeup of this phenomenon. My understanding of it is mostly assembled from following informal discussions on the computer-go mailing list for several years. In a quick search through my gmail archives I can't find much on the subject, but here's an interesting post about related topics in the computer chess world (that incidentally doesn't talk about randomness, but illustrates well the benefits of avoiding bias): http://www.talkchess.com/forum/viewtopic.php?topic_view=thre...
What you describe is somewhat similar to what I had in mind, but a more well-defined abstraction. I hadn't yet formulated it in terms of types, because for now it's just a hack in the bootstrap interpreter, and anyways a lot of Mutagen's type system is still in my head, waiting to be implemented once I have a better understanding of how/why other functional languages do this stuff.
I'm interested in how various languages handle this, mainly so I can steal ideas for my project Mutagen, a purely functional Pythonic language. I recently added modification operators that behave rather like a nestable setitem/setattr. Basically:
list_of_objects = list_of_objects <- [index].attr = 'abc'
I've been thinking about ways to make this extensible and flexible (e.g. returning a list of effects to apply to an object, or having some post-processing for any bookkeeping an object needs). The copatterns are pretty cool looking, but I'm not sure how I'd fit it into Mutagen's imperative-esque syntax.Glad to see Rust getting more traction. I'm not a huge fan of the syntax, and I'm personally putting my chips in the purely-functional space--but it's the most promising as far as a practical C++ replacement with much better semantics, which is sorely needed.
Of course the tiles aren't so bad. My objection to them is mostly on principle, out of fear that it's another step in Mozilla becoming excessively beholden to advertising interests.
I think your choice of license may be incompatible with the GitHub terms of service--there's an implied right to fork by using GitHub, but your license states no derivatives are allowed. IANAL, but something to look into: https://help.github.com/articles/open-source-licensing
As I mentioned in another comment, it's pretty slow under Firefox.
Lastly, the game is quite pretty, but I feel that since the gameplay involved is so precise, the imprecise visuals can be confusing. It's hard to tell exactly when a piece is going to set in place, when a group is eliminated, what would happen if you rotate and a piece is blocked by a stack already in place, etc. I went by pure geometry at first, but I definitely got bitten a few times where a piece moved after I thought it was in place, or a piece didn't get eliminated with the rest of a group since it hadn't fully landed in its column. The collision animations don't quite help there either.
I tried again in Chrome and its a lot faster, and does get faster throughout the game as well. More fun and challenging, but yeah--it does get too fast too quickly.
MULX was introduced on Haswell as part of the BMI instructions. Basically it allows two explicit destinations (still an implied rdx source though).
ADCX/ADOX are pretty weird. They both operate basically the same as ADC, but only read/write the carry or overflow flag respectively. The idea is to allow two interleaved independent chains of adds, putting less pressure on the out-of-order logic on chip. This seems kinda weird though: the renaming logic would have to detect that the bit of the flags register that one chain of adds reads aren't written by the other chain, so those instructions wouldn't be hazards, and thus both chains can be executed in parallel. OTOH, IIRC there are other instructions that only write certain bits of the flags, so I guess the logic for this bit-level renaming of flags is already there.