Hello, this is not a review/summary/commentary of Kokoro Connect. Just some Inaban screenshots I have captured this far. Contains spoiler.
On AFAID 2012
So, uh, in the end, I decided to go to this AFAID despite my current state. Due to that I got laziness fee of 100k IDR for buying two days worth of standing concert tickets (which includes stage and exhibition tickets). On the brighter side, there’s almost no queue for this type of ticket which, from what others told me, saved me two hours of queuing.
Low End Box and Web Applications
…one does not simply run both PHP and Rails applications (and MySQL) in single 128 MB box.
This is what happens if you try doing it. Swapping all the time. Hopefully Debian will fare better but it means I’ll need to reinstall the box again. I’ll do a test run in my local machine first though as not to waste my time doing backup/restore again like today.
(Yeah, Zeropaste is up at p.myconan.net)
Zeropaste – the featureless pastebin
Tonight, when trying to compile Rubinius with Rubinius, I got some errors and wanted to report to relevant party. As usual, the log of what happened is required so I used my usual pastebin – pastie.org to send the logs. But then I noticed that the “Raw” link in it doesn’t provide an actual raw file anymore. What the fuck. It is now a html disguised as txt.
So I decided to whip up a new pastebin (because the world need one more pastebin) which doesn’t have any actual features (like tag highlighting, etc). I also learned the way to create shortest RESTful path possible (read: ‘/’).
There may or may not be more features coming. Developed in Rubinius because I can. Using mysql because of where it’ll be deployed at (see below).
I’ll get around deploying this soon after reinstalling VPS running this blog to Ubuntu or Debian. Running yum in a 128 MB box is suffering.
[ Source Code ]
Ruby 1.9, Rails, and UTF-8
(main purpose of this post is to link this “server error” page of rubygems.org)
The relevant issue in Rails Issue Tracker (3789). AFAICT, there are few ways to “fix” (read: workaround) this:
- Modify the relevant Rack code to handle this crap
- Create additional middleware to intercept (how?) the request (tried, either didn’t work or horribly inefficient)
- Extend rack before it is started
Well, they all sucks. Hopefully someone comes up with actual working solution for this.
Oh, there’re another solutions:
- Use REE 1.8 (really?)
- Use JRuby in 1.8 mode
- Use Rubinius (rbx 2.0 where?) in 1.8 mode
Um, yeah.
Update: I figured out how to “fix” it. Check it out in Moebooru (requires this).
Rails: read_multi and dalli
Be careful when using read_multi with dalli: it may return nil-valued key instead of the correct key.
The issue is tracked here and thanks to this I dropped the read_multi usage in moebooru and used the much simpler (and most likely slower) single fetch (per entry) instead. There’s alternative way to use it – do a read_multi and refetch whatever missing/nil-keyed but apparently I’m too lazy to do it.
Configuring SHA rounds for password in RHEL5/6
Due to NIH syndrome and Drepper being Drepper, the only remotely secure password hashing algorithm in RHEL5/6 is multi-rounds SHA512. The default is just salted SHA512 which sucks.
Also applies to CentOS, ScientificLinux, and other RHEL clones.
Anyway, to update the default setting, these files need updating:
/etc/login.defs
: add new lineSHA_CRYPT_MIN_ROUNDS 5000
/etc/pam.d/system-auth-ac
: find line with `password sufficient pam_unix.so sha512
` and appendrounds=5000
.
Note that the change to last file may or may not be persistent. I have no idea how to properly set it up.
Finally, run this command: authconfig --updateall
.
If you’re using RHEL5, run authconfig --passalgo=sha512 --update
first.
Moebooru 3.2
Finally reached the goal: Rails 3.2.6. The isn’t much change between 3.1 and 3.2 which is why I skipped 3.1. As there isn’t much front-end change, it means there isn’t any user-visible changes. Or at least there shouldn’t be.
Plans:
- Move to jQuery
- Use paper_trail for versioning (or something else)
- Add SVG support (and maybe drop SWF support)
- Actual news ticker
- And more!
3.2.0 has been branched and currently running on some servers. The next version, 3.2.1 is on default branch and being tested on moe.myconan.net. As (finally) there are database changes, it will not be tested directly on live servers until it is stable enough.
Changes include better support for JRuby, use mini_magick instead of custom plug-in, less monkey-patches (but more bugs), and various clean-ups.
Rails 3.2 in Subdirectory
Steps to be into Rails in subdirectory:
Update config.ru
to understand the subdirectory mapping:
run Moebooru::Application
change to
map (ENV['RAILS_RELATIVE_URL_ROOT'] || '/') do run Moebooru::Application end
And then start Rails with correct environment variable (example if you use Unicorn):
RAILS_RELATIVE_URL_ROOT='/img' bin/unicorn
And that’s it. No need to mess with routes.rb
as I previously thought after searching and experimenting for few hours. Links etc are properly generated with correct prefix. Or at least based on my quick testing.
May or may not work with earlier version(s) as I haven’t bothered to test it anywhere else.
This Sengoku Collection
A lightweight series which cover one or more generals (female version, obviously) from Sengoku period who have been thrown into modern time. Basically yet another moefied historical figures anime.
What’s mind-blowing is the fact that it will be a 2-cours (26 episodes according to Wikipedia) anime. Like, how is it even possible? (perhaps because it’s produced by Brain’s Base?)
Its first opening theme (and ending) is awesome (read: fun) though.
Added Ubuntu Server in TechTips
As per title, I added my own reference of basic tasks after installing Ubuntu Server.
Basic Dovecot/Postfix in Ubuntu
Configuring mail system is annoying. There are quite a bit different components which must be configured to work together.
My main choice for mail system is dovecot/postfix. As I don’t really understand how all this thing goes, I may have missed or misunderstood some parts. Or most of them. Feel free to correct this post.
For starter, most of basic configurations for Postfix and Dovecot has already been done by Ubuntu (or Debian) default configuration which includes enabling IMAP and TLS.
LDA
LDA (or MDA) delivers received mails to correct user and location. I let dovecot handle this thing because it’s easier this way. In /etc/postfix/main.cf
:
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"
[ Source ]
And that’s about it.
Maildir
The Mailbox format. The alternatives are mbox
(ancient, shouldn’t be used anymore, I believe), or dbox
(Dovecot only), or some other formats (which I don’t really care about). So basically I go with Maildir.
/etc/dovecot/conf.d/10-mail.conf
:
mail_location = maildir:~/Maildir
[ Source ]
SASL
The last one, Postfix authentication. I use Dovecot SASL because it’s easier.
/etc/postfix/main.cf
:
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
/etc/dovecot/conf.d/10-master.conf
:
unix_listener /var/spool/postfix/private/auth { mode = 0666 }
[ Source ]
For Dovecot config, it’s usually already in there, one just uncomment it to enable.
Restart Dovecot and Postfix, and that’s it. As I mentioned before, Ubuntu has preconfigured many things which leaves me only few additional tasks to be done to enable simple mail system (with TLS, IMAP, and whatnot).
Protip: use Google Apps or Live Domain instead of managing your own mail server.
Tags again (now with Rails code)
I’ll put it here for my own reference:
def self.slow_has_all_tags(tags) p = Post.scoped pt = PostsTag.arel_table pt_arels = [] tags.each do |t| t_id = Tag.where(:name => t).first[:id] pt_arels << pt.where(pt[:tag_id].eq(t_id)).project(pt[:post_id]) end pt_arels.each do |q| p = p.where(:id => q) end p end
And in fact, relatively fast.
Disabling Upstart Service in Ubuntu (11.04+)
Took me few weeks to find out that this one-liner does wonder:
echo manual >> /etc/init/mysql.override
(the line above is to disable mysql, obviously. And must be done as root)
The answer is on first hit (as of this post’s writing) of googling “ubuntu disable service” but you need to scroll down a bit and ignore shitload of crappy, outdated explanations to find that small gem.
Unfortunately doesn’t apply to previous LTS. Or does it?
Virtual Machines
Moebooru/Rails 3, and more
After working on it for several weeks, finally it got to the point where it’s relatively usable. No more Bundler-on-Rails2 evilry and the fact that 3.0 branch is still supported.
The best part is the one above. Yes, Moebooru now runs on Rubinius/Puma. The only foreseeable problem is it uses Process.pid on file uploads which, when several people uploading (or working with) files at same time, the temporary filename will collide.
Though due to me aiming more for workable implementation instead of correct implementation, there are quite a lot legacy stuff still in there:
- repeated_auto_complete doesn’t work in Rails 3 without vendoring or updating the gem itself (and I did both since Bundler’s git functionality seems broken in Rubinius).
- prototype_legacy_helper must be used since I haven’t had time to upgrade the *_remote functions (and still thinking how to do it).
- verification gem since I haven’t upgraded the route and its functionality, which previously built-in in Rails 2.3 has now removed.
- Unsightly lib/core_ext. Just look at evilry I have added to make it behave like 2.3-stable.
On the brighter side, now I can start cleaning up the code. Or upgrade all the way to Rails 3.2 ( ¬‿¬)
One does not Simply Run Unicorn in DFBSD
Um, yeah. Running Unicorn on DFBSD (in VMware) caused kernel panic. I have no idea why.
Tags again, denormalized
There’s a problem with nested query I previously mentioned: query time is unstable. The worst case is at least as slow as multiple self-join method – when the first few search key result is too big.
Optimize all the queries!
While digging more into the code called “Moebooru” which was forked from “Danbooru”, I noticed this:
def self.included(m) m.extend(ClassMethods) m.after_create :increment_count m.after_destroy :decrement_count end def increment_count connection.execute("update table_data set row_count = row_count + 1 where name = 'users'") end def decrement_count connection.execute("update table_data set row_count = row_count - 1 where name = 'users'") end
Counting takes ages, right. Except it is not. I’ve done this, yes, but on a table with 10+ millions of data (this one has ~400k in mainline danbooru), with multiple data inserted (this one got, uh, one every other week?) and queried every second (see below), and with the required count method not a simple select count(1) on some_table
(which is what the example above used for).
The best part? It’s only used once, when user registers:
def set_role if User.fast_count == 0 self.level = CONFIG["user_levels"]["Admin"] elsif CONFIG["enable_account_email_activation"] self.level = CONFIG["user_levels"]["Unactivated"] else self.level = CONFIG["starting_level"] end self.last_logged_in_at = Time.now end
Moebooru Update
I haven’t been able to work on Moebooru for most of this month but I got to work on it this weekend. At ~30 changes, it went from -alpha to -beta.2 after receiving good amount of tests.
Summary of changes (more or less):
- Most instances of RAILS_ENV and RAILS_ROOT have been replaced with newer Rails.env/Rails.root
- Better Javascript handling in Development mode by moving cached Javascript from application.js to cached/all.js
- Removed AssetCache modification library
- Replaced HTML5Sanitizer’s html5sanitize with Rails’ built-in sanitize (because the former doesn’t work in 1.9)
- Fixed Note Editor’s “History” button
- Fixed Comment page’s pagination
- Fixed Tag Relation search function
- Updated “hack” for UTF-8 handling in Rails 2.3 with Ruby 1.9
- Merged updates from moe branch
- Reverted change which put class definition in <html> tag as it currently required by Javascript
Searching Tags in (3NF) Database
This afternoon I experimented with tag searching. Current implementation doesn’t scale beyond 6 tags due to parsing requirement. You can argue about binding variable all day but in the end it can be abused easily if the limit is lifted.
Continue readingzpool hourly status check
I’m setting up cron job for a storage server using ZFS. There’s zpool status -x
but it returns “all pools are healthy” (or “no pools available”) on no error and prints errors to stdout (instead of stderr), rendering it annoying for cron job.
#!/bin/sh set -e set -u zstatus="`zpool status -x 2>&1`" case "${zstatus}" in "all pools are healthy"|"no pools available") return 0 ;; *) printf "%sn" "${zstatus}" >&2 return 1 ;; esac
Put it in a file (e.g. /root/bin/zpool-status-cron
), make it executable, and add it to crontab.
Unofficial Sentai Akibaranger
A metaseries on Super Sentai. In short, they opened tvtropes and jammed as many tropes as they can into the series.
Head over to Over-Time to grab the releases (currently 2 episodes). Don’t forget to read the notes, too! I wish more fansubbers do this for reference-heavy series.
I’m pretty sure “Nijiyome” there is abbreviation of “nijigen yome” (2D waifu).
Haiyore! Nyarlko episode 1
Supipara demo movie
Demo movie for Supipara – minori’s latest game/series is out. No high quality video in sight though. And the animation isn’t by Shinkai – just like eden (and I suspect we’ll get no more minori/Shinkai combo) but still pretty enough so it’s okay.
As expected, there’s no male in sight. The game is all-ages though so we won’t get some actual yuri action either 🙁
[ Link to video ]
Accel World
One of the hyped series for this season, spring 2012. Looks quite good. With Sunrise as production studio, I can safely expect stable animation over the series. No clear indication on how long this will be though considering the amount of its LN, I guess half-assed ending should be expected.
And yes, Black Snow Princess (aka Kuroyukihime) makes up 90+% of reason I’m watching this as of currently :>
This Aquarion Evol
Tinkle Artbook GET
Finally ;_;
The overall cost went through the roof because I forgot to calculate the handling fee. The total is 6000 JPY + 217k IDR (about 1mil IDR). Should’ve bought three of them to reduce shipping fee overhead.
Well, not too bad as this is my first amazon.jp purchase. Perhaps I should try using alternative store with cheaper shipping cost sometime later. Or next year once my life settles down again.
On Winter 2012
All right, I’ve finished most of Winter 2012 (I count the start of year from Winter by the way). And, um, I’m not sure where to start so I guess I’ll make it point by point for each series.
Continue readingInu x Boku SS
Anyway, it ended quite nicely. The premise was simple and mostly solved by the end of this series. Another series done well by david production – too bad they aren’t doing anything (or at least as the main production team) for this (next) season. Oh well, hopefully we’ll get more interesting series from them sometime in the future.