Welcome to EnDavid.com. You can find here a compendium of things that I have published and other stuff I made during my spare time.If you get lost, try visiting the Site Map.In this main page, you can find my main blog, where I keep track of the updates of this site, and post some technical articles from time to time. If you are interested, just subscribe to the RSS feed.
I've just updated the style of this web page and this blog post is mainly to test that everything works correctly.
Colors
I wanted to keep the website colorful, but with less color chaos. So I've tried to reduce the number of colors, while keeping some interesting hues. I've also tried to keep the contrast that I had, so it's easy to read (at least for me). The final palette is below:
Here's the list of colors in CSS:
I've simplified the CSS because it was pretty chaotic after the years. That means some pages may not render well at the moment, but I will update them with time.
I've also ditched the style variations that I had. Not sure people ever noticed them, but you could click on some subtle bars under the logo to switch to some retro styles, inspired by the Commodore 64 and the Amiga Workbench 1.3, respectively:
The blog entries were inside a table, but I've replaced them by divs. Historically I used tables because they were easier to layout, but they aren't very flexible. Again, some old pages may still use tables, so I'll try to update them when I can (or ditch them).
Animation
I kept some subtle animations that add drop shadows when you hover over buttons, and some scaling animations for the shortcuts to my apps. But still, it feels the page is quite static and dull. I've changed the logo to some pixel art and I've animated it. It's an animated GIF, old-school but lightweight. At least something is subtly moving all the time, without being a distraction:
Font
I'm now using a single font everywhere, and I adjust the font size and weight only. I think everything looks more consistent this way. It also seems that thinner font weights is what is considered "modern" these days.
Before and after
Finally, here's the before and after, rendered in Safari.
Before:
After:
The UI is responsive, so in principle it should render fine in narrow windows (i.e. smart phones on portrait mode).
I'll post in Twitter a few screenshots of the slides I made when I was thinking of the new design. Take a look if you want to see some other color variations that I prototyped in Keynote. And message me in Twitter if you have any comments.
Tweet
I've recently released a new Spanish word puzzle game for iOS and macOS, Sopilabitas (Word Wall ES). Here's a 30-second video preview:
It took 3 weeks from the submission date until I could finally release it because of Apple Guideline 5.2.3 that states that apps should not facilitate illegal file sharing or include the ability to save, convert, or download media from third-party sources without explicit authorization from those sources (details: App Store Review Guidelines: Legal). My game doesn't, but Apple seemed to think otherwise when they decided to reject it.
I've dealt with rejections in the past, but I usually understood what they were asking for. This time I was clueless, and the back and forth with Apple was really frustrating. I think they send automated replies to some messages, and for the rest there may be an operator using templated replies. When you finally speak with an Apple representative, they are very supportive, but speaking to them may not solve the problem straightaway either. I'll give more details.
Why now?
I'm not sure if the 5.2.3 guideline is new, or if Apple has recently added some automated checks to look for possible infringements of this. The thing is that I have other word puzzle games in the App Store (Silabitas, Sil·labetes, and Syllabits), all sharing similar code and assets, and I never got a rejection because of this guideline.
Searching for people with the same problem I found that many get this rejection because they include in their app a library that enables YouTube streaming. This GitHub thread is quite interesting: XCDYouTubeKit App Store Rejection. I do not use any Third-Party libraries, so that couldn't be the case. I only use Apple libraries and everything is programmed natively in Swift, with no external dependencies. Precisely to avoid this kind of problems where you don't know exactly what's going on.
But I didn't know what was going on. And Apple didn't explain.
Apple Resolution Center
What a pain. I got two separate rejections for exactly the same issue: one for the iOS submission, and another one for the macOS submission. The first thing that comes to mind is: should I reply the same to both? One didn't seem aware of the other, so I tried replying separately.
The only thing I thought that could be doing any audio or video streaming is a WebView component that I use to search for definitions and translations of words (although I also use this in my previous games), so I made a more restrictive policy of the websites it can access and resubmitted the game. I got rejected again. The macOS rejection became a "Metadata Rejection", because they just required me to submit proof that I had the rights to that third party content. But what content? My inquiry to Apple:
Could you explain what is it that provides unauthorized access to third-party audio or video streaming? Is it because of the App Transport Security Settings? I disallowed arbitrary loads in the latest build but it's still being rejected.
All the assets in my game are drawn by myself, and all the music is under Creative Commons 4.0, as listed in the description of the app.
(I also directly contacted the author of the music and I got explicit permission to user his music. Again, I've used his music in all my games and I never had a problem.)
The reply from Apple looked templated:
Regarding the Guideline 5.2.3 - Legal, your app contains contents or features that may violate the rights or one or more third parties. Specifically, your app provides potentially unauthorized access to third-party audio services.
Well, I do not access any third-party audio services. At least not willingly. I thought it could be because if you access Google Translate from the WebView, you can click a button to listen to the pronunciation of those sentences from Google Translate. The thing is that this rejection was for the macOS submission, which doesn't use the WebView, but jumps directly to your external browser instead (but the WebView reference still appears in the code).
At this point, I asked to speak to an Apple representative, and they scheduled a call for 5 working days later. In the iOS submission thread I told them I had scheduled a call with an Apple representative, from the macOS rejection thread, and they sent me a Clippo-like reply: "It seems you want to speak with an Apple representative. Give us your phone number and someone will call you"... Something like that. The Apple representative later confirmed that they do send automated replies at times.
I'll skip the gazillion frustrating messages in the Resolution Center and jump to the end.
The Apple representative
After a week or so I managed to speak to someone at Apple. It turns out it was all a misunderstanding. They thought I was streaming the music for the game, when it's all embedded in the binary. Regardless, I had put all the license information in the description, so I'm not 100% convinced with that explanation. Also, he couldn't explain why this flag has been triggered now, but never before. Basically, I want to know how to avoid these rejections in the future, because the back and forth with Apple is not fun.
He couldn't explain those things, but at least he was supportive. He was calling for the macOS rejection, but I told him I had the same rejection on iOS and he looked at it as well. He said that both submissions would be back to review in 24 hours, and that probably they would get through.
But that wasn't the end. Yes, the macOS submission went back to review after a couple of days and it was approved on the third day. However, the iOS app continued rejected. I sent a message to the Resolution Center after one week and I got not reply. After a few more days I think I poke them again and asked to speak again with someone, but the game went finally back to review and it got approved soon after.
Conclusion?
Not sure what to conclude from this. Is Apple worse than Google in this respect? No idea, because I'm not releasing games for Android. Google has a similar guidelines to publish in their store. The problem is not with the guidelines, but with the support for developers. I'm paying Apple an annual developer fee, but I haven't managed to make any profit from my games. Is Apple thinking I'm not worth their time?
I make my games mostly for friends and family, as a hobby. But this legal process is for big companies rather than individuals. They supposedly support indie developers, but the process is becoming unfriendly.
I understand that there are too many devs and they need to automate process to detect infringements of guidelines and also automate replies whatever possible. But even if I understand, it doesn't make it less frustrating. Previous rejections where much more clear: if you press this, your app crashes. Fine, I can fix it. But I feel for this legal guideline they are being over-cautious because they want to protect themselves from lawsuits from third-parties. They want the developer to be responsible for any liabilities. But obviously I can't provide evidence of something if they don't tell me exactly what that something is.
I started creating Sopilabitas in January, so after 8 months of development one is eager to release, and getting a rejection of something you don't understand is quite upsetting. I'm taking a break from indie development for a few months. But I'll come back because I have some other ideas waiting in the backlog.
Tweet
Happy new year 2020!!!
I should have written this in 2019, but I guess it's also good to start 2020 with a retrospective of 2019.
Achievements
Work
We got acquired in July and unfortunately most of the development team was made redundant, since we stopped the development of our main products. But I was fortunate to stay and I wrote a plugin for a draping simulation program. Details here: EcoShot beta. We'll see in the new year how the product evolves, but I learned many things (see Power Up section).
I've been using at work the WebGL Model Viewer I open-sourced in 2014 (the first version is in webGL-tests), so I've added some interesting functionality to it. The most recent one is just from the 31st of December 😃, a shader to visualize the intersecting volumes of a mesh: Self intersections (pull-request). You can test the Model Viewer here: WebGL Model Viewer.
Technical blog articles
I haven't written much this year, but I think wrote some interesting stuff:
I added some AR functionality to VidEngine, and I was creating an AR app with it, but unfortunately I didn't finish it. At some point in summer, I paused its development to start creating a new game,
Syllabits
Syllabits is an English word puzzle game. It's basically the same as the Spanish word puzzle game Silabitas, which I released in 2016. I spent some time to update the art and I tried to improve the tutorials. I was moderately successful because the game made it to the "New games we love" list in Apple App Store in the UK. It was 4th in the list, and approximately 6 million people saw the banner. The conversion wasn't great, and only about 200 people downloaded it. However, that's quite an achievement for me, since I earned more with that game than in the 6 years I've been in the App Store combined.
Apart from Syllabits, I released some small updates to other of my games and apps:
May and Yam Against Pollution. No new contents, but it was a big update, where I finally added support for iPhone X and iPhone 11 screens, and I resurrected the Apple TV build, which was broken.
Another rewarding thing was that I got contacted by a professor in San Francisco that had found my State Machine web app and he wanted to thank me because he was using to help teach coding to impaired students. 😊
Power up
Between work and my indie development, I practiced mostly 4 programming languages,
Python. I've never been very fond of Python, but it was the quickest and most maintainable way to create the plugin I'm working on at work. So from almost 0 Python I've gone to use it daily.
Swift. I keep using it for my indie projects. I've been updating my projects to the latest Swift, so I think I'm up to date.
C++. C++ is still a big part of our core technology at work, so I keep using it. I did some interesting progress with cmake and got some of our stuff even working on macOS.
Javascript. Mainly for the WebGL Model Viewer, and some node.js scripts.
I also learned new things about character animation, skinning, and even draping. Just small details, a window to the world of difficult math problems. As always, I feel I know nothing... But any small progress is still progress.
Also, this year I attended the 3DBody.Tech conference in Lugano. Lots of interesting talks and I met some nice people there.
I haven't read much this year, but I practiced reading some Japanese through Uramiya Honpo. I read the 2nd series this year, and I'm about to finish the 3rd series now, Uramiya Honpo REBOOT.
I think I did a bit more cooking this year. I managed to prepare a decent zarzuela, a quite moist pumpkin bread (which I repeated a couple of times with carrot), and even custard pudding with castella sponge cake. I made myself many treats during summer as well, like vanilla floats on matcha, or matcha rolls, and the home classic custard and chocolate maria cake.
Power down
Time is limited, so you can't focus on everything... Here are some things I haven't practiced much (or at all... 😅):
Piano
Drawing. I stopped taking part of #pixel_dailies. However, I had to draw some art for Syllabits, and I also drew my regular Nenga to greet the new year: 2020年明けましておめでとう!
C#. Well, we don't have to maintain any C# code at work at the moment, so I basically stopped using it.
Fun
Unfortunately, I couldn't visit Japan this year. But I managed to do many short trips around Europe instead:
Barcelona. I visited my family in January, April, June, September, and December 😍
Iceland. I had never been to Iceland before. All my connection to Iceland was through Björk 🙈 But we visited it twice this year! In January and September. We wanted to see the aurora, the northern lights, but failed in January. We managed to see them quite subtly in September, but it's better than nothing. Here's a humorous video of the January trip to Iceland: Iceland "documentary"
Basque Country. We visited San Sebastian and Bilbao in September.
Lugano. I went there for the 3dbody.tech only, so we couldn't do any sightseeing, but at least we did a short walk around the lake.
I found some time to play games as well. I cleared God of War on PS4 (video review), and Final Fantasy XIII-3 (Lightning Returns) on PS3 (video review). I also started Death Stranding, but I haven't cleared it yet (our TV died on X'mas eve 😭).
On mobile, I cleared a cute puzzle game called Telepaint. Apart from the nice puzzles, the graphics are very cute and the music is quite nice.
Not sure what music I would recommend this year. I'm quite hooked at Death Stranding soundtrack at the moment, which won the Best Soundtrack award at the Game Awards. Check BB's theme, and also Chvrches' Death Stranding. I think the best videoclip for me goes to Rosalia's Bagdad (although it's from December 2018, but I discovered it in 2019).
I haven't watched many movies this year. The most entertaining one was Star Wars: The Rise of Skywalker. I know it has many negative reviews, but I enjoyed it.
And my most visited blog post in my Spanish otaku blog is a list I made with the best Japanese music of the Heisei era, one per year, to commemorate the end of the Heisei era in Japan: Best J-Pop Era Heisei. I made a couple of playlists in Youtube: Focotaku Heisei Best J-Pop, and Focotaku Heisei Best J-Pop Side-B.
And that's all!
Happy new year everyone! Thanks for reading! ❤️
Tweet