Hacker News new | past | comments | ask | show | jobs | submit | jlujan's comments login

Their "Trusted Root Catalog" is a total fiasco as well. They were one of the AWS IoT launch partners and they apparently repeatedly failed to including AWS root authorities in their catalog. They were responsive in acknowledging, but typically took a month plus to actually update the SDK, (released quarterly,) to address it.

https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/...

They did finally provide a method to use a custom root CA for SSL a year later, https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/....

They seemingly failed to comprehend why anyone would not want to use TI's chain of trust, that is not manufacturer customizable, on proprietary IoT devices. This was explicitly an issue for code signing as well, as it required obtaining a third-party code signing certificate from any number of CA's instead of using our explicit root CA.

[edit] spelling, clarity


Layout is very similar to https://artlist.io/page/aboutus


Interesting find. Whois does not show correlation ( site is almost identical ).


When going through a similar event, I was able to find resources at the hospital that helped a lot. In life and death situations they often have patient advocates on staff. I was able to reach out and had a patient advocate, either a nurse practitioner or doctor, that helped sort out the communications. A lot of the stress came from doctors' reluctance to put things in simple terms. The patient advocate was able to basically come in and say, "Look, they can put a pacemaker in, but your loved one only has 12% heart function and is still dying." It was received differently than a family member saying it. After all, their job is to advocate for the best interest of the patient. Ours actually got pretty angry with the doctors for how things had been allowed to progress. Hospitals usually have grief counselors and social workers as well. Just getting the brother extra support might be enough to open him up.


There is T.h.e. Brain trust that hosts online support groups for brain tumor patients and caregivers. I am on the adult ependymoma mailing list. It is a good way to find specific hospitals and doctors to get in contact with. The ependymoma list has a couple of doctors that regularly communicate on specific questions.

Their GBM specific list is here

http://braintrust.org/groups/gbm/

Edit:spelling


As a residential subscriber this is contractually the case. ISPs do not allow the operation of servers in residential contracts and they are almost always provisioned with asymmetric speed. 50 down, 5 up, etc.


>I have occasionally downloaded apps through one of the APK downloader services mentioned in the article comments -- I've had mixed luck.

One of the biggest issue of running Apps (open source or not) is the inclusion of the Play Store API in the app itself. These apps when not logged into the play store usually crash with NullPointerExceptions. Please... if you are an Android developer... expect your third-party services/APIs to be missing or to crash and handle that case... If you include the Map API or several other Google Services APIs in your app and the Play Store is missing or the user does not have a registered account... calls to those services will most likely result in NullPointerExceptions. Tell me to deal with it, don't crash.


Presumably if developers only distribute their app via the Play Store, they aren't too worried about whether their app users are using the Play Store.


presumably, as a programmer, you check return values. Especially if they could be a null reference


Any reference in Java can be null, as is the case in most languages. So developers only check the ones they know "could" be null, in normal operation. If you only distribute your app via the Play Store, attempting to access it will never fail, thus there's no more point in checking for null pointers than there is in checking the result of String.split: it will never fail, short of something wacky and unexpected like a broken JVM.


> So developers only check the ones they know "could" be null, in normal operation.

Not the good ones. Normal operation isn't when you're dealing with a mobile device, there could be any number of reasons why your app can't reach a certain service delivered by some API so better to be prepared for that eventuality.


Yes, a good programmer writes a robust application, but ignoring the specifics of this case is being entirely disingenuous. If I write an app to use the Play API and only distribute it via the Play Store then there is no good reason for me to spend my time writing `if (foo != null)` all over the place to placate someone trying to circumvent the official way of downloading my application.

You have to balance the tradeoffs of bloated code and pointless error checking with adding features and improving the program. The more error checking code one writes the more one must maintain and the higher the potential for bugs.


> The more error checking code one writes the more one must maintain and the higher the potential for bugs.

That's an artifact of the chosen environment. Not checking for errors in that environment is a bug.


Artifact or not, it's still something one must maintain. Not checking for errors is not a bug, it is you choosing to not support a fringe group of users because it is worth your time and effort. You can call it whatever you like, but that is the reality of the situation. There are tradeoffs to be made and code to be maintained.


I don't think it is a matter of not being able to reach Google the network service but the Google provided services that run on the phone (they may well then access the network and provide useful error messages that you fully handle). It is more like a case of a missing library than a loss of network connectivity. There is a good argument that you should always check anyway but there is also the argument that the app is only designed to run on devices with the Google Play services installed and that you only sell it that way so anyone without must be pirating anyway.

Besides that what do you do to handle the loss of something your app requires as a basic service? A nice error beats NullPointer but not by much.


Actually the way you check for Google Play services doesn't involve nulls at all, it's a status code.

And related to null-checking, I took the pervasive approach in one of my apps for fun. It's hilarious - almost 1/3 of my app is checking if something is null. Makes you wish for a switch to a language where nulls don't exist unless explicitly asked for.


Not always. If you use maps, for instance, then calling getMap on a map fragment when Play Services isn't installed will give you back a null reference.


I agree that an app shouldn't crash, but piracy is a problem.

Google In-App purchases are safe, so if that's how you monetize, I don't see why the app should be allowed to work anywhere else but in Google's environment.

It's different if the app is open source or you don't need to monetize (sadly, not everyone can afford that luxury), but even there it depends on how important those Play Store API features are to the functionality of the app.


Apps that are provided with for free on Google Play, IAP or no IAP, don't have any fear of piracy from being installed from another source. If Google Play is not available when your app runs, if the user could use that app for some purpose, it is a really good idea to make sure it doesn't crash. Indeed, most free apps with IAPs don't require you to buy the IAP immediately at launch, you can use the app to some degree.


It just depends on how much extra cost is invoked by having more users who never pay. (for example support, server costs)

I just don't think that you can follow some rule dogmatically, because for some it might be worth the exposure, for some the extra costs might outweigh the benefits.

This is something that I would decide on a case by case basis.


I just don't think that you can follow some rule dogmatically

Sure you can, if the rule is "don't write shitty software that crashes". In which scenario do you think users are more likely to buy: when an app crashes with no indication of what caused it, or if an app pops up a message along the lines of "we couldn't connect to Google Play; is it disabled for some reason?"


I stated clearly, that every developer should aspire to develop apps, that do not crash.


don't have any fear of piracy from being installed from another source

Even if they're currently fully unmonetized, many such apps exist on the Play store because they can be updated at any time to include in app purchases, etc.


There is no such thing as "piracy" in these situations. There may arguably be a freeriding problem though.


I wonder if it's possible to build an emulator image based on CyanogenMod with no Play Services. That'd help with testing the apps, but it's another "device" to target.

Developers would be able to see from the crash reports how many NPEs from missing Play Services they're getting and prioritise accordingly.


Not only it's possible, it is supported out of the box. When you are configuring the emulator, you are choosing the OS version (API level). You have to choose, whether you want "Android" or "Google API".


What you are referring to is a design pattern called fluent interfaces[1]. They do make for very usable APIs when used to represent pipelines and filters. They are also used heavily in creating domain specific language features. In your SQL example it works very well such as in SQLAlchemy. But in that example, the chained methods are building a query as opposed to mutating the actual data. Splitting hairs.

[1]http://en.m.wikipedia.org/wiki/Fluent_interface


> Splitting hairs.

Severely, since what you're doing is mutating the actual state-data of the query object.


In the case of SQLAlchemy you are not. The cascading methods on query objects create new query objects as it should be. Mutating objects with cascading methods is horrible API design as it suggests immutability where there is none.


the API in some ways comes from that of Hibernate, which does actually mutate in place (see http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html...). I felt that keeping the existing object un-mutated is a lot more intuitive. I think the names that you choose for the methods do make a difference, e.g. Hibernate is saying "add()" which for whatever reason seems to imply "mutation" to me, not sure why.


Having used hibernate extensively (and considering many of it's features remain completely unmatched in any other ORM I've encountered), I can say that I strongly dislike the idea of mutating the query in place. There's huge advantages to each chain returning an independent and valid query that can be executed, referenced, and added to. I don't see any upside to the Hibernate approach here, and it violates "Prefer Immutability".


Oh right, that's fair. Same in Django (and you're right, mutation in this case would be horrible design), I suppose I was mixing the metaphorical with the actual.


Another nitpick. The article doesn't specifically say text file. Who is to say it has newlines at any reasonable spacing. Why is this front page.


Screw map, let me pass a comparator function into sort for interfaces.


That's not necessary. You can just create a type that embeds the type you're sorting, and define the Less function however you like. It's very efficient since you're just wrapping the entire slice object, not every element in the slice.

  package main
  import "sort"
  type RevIntSlice struct {
      sort.IntSlice
  }
  func (arr RevIntSlice) Less(i, j int) bool {
      return arr.IntSlice.Less(j, i)
  }
  func main() {
    myList := RevIntSlice { sort.IntSlice {1, 2 , 3 } }
    sort.Sort(myList)
    for _, elem := range(myList.IntSlice) {
        println(elem)
    }
  }
Note that if all you want to do is reverse the sort order, sort.Reverse is a better way than what I wrote here. This is just an example of the kinds of things you can do.


>That's not necessary. You can just create a type that embeds the type you're sorting

But that's more work (and more boilerplate) than simply passing an anonymous comparator to the sort function.


Let me guess. You are coming from Java. In Java this would be:

  myArray.sort(new Comparator<MyClass> ({
    @Override
    CompareTo(MyClass lhs, MyClass rhs) {
      return rhs.compare(lhs);
    }
  }));
Is that really shorter? I don't think so.

In any case, there is a more elegant solution in Go, which is simply:

  sort.Sort(sort.Reverse(array))
You need to open your mind a little bit, to learn a new language.


You are coming from Java.

Nope. Clojure and Haskell. Clojure:

    user=> (sort > (vals {:foo 5, :bar 2, :baz 10}))
    (10 5 2)
Haskell:

    >>> sortBy (flip compare) . map snd $ [("foo", 5), ("bar", 2), ("baz", 10)]
    [10,5,2]


Yes. I am aware how to sort and can only read your comment as as informative sarcasm as to the ease.


I am new to go with a Python and C# background. Using Revel on my latest project. Not completely convinced it provides that much over roll-your-own or composition with Gorilla's libraries. I much prefer Gorilla's mux to Revel's routes. Looking at the source code has been highly beneficial to learning Go, so Thanks all the same.


Consider applying for YC's Summer 2025 batch! Applications are open till May 13

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: