December 12, 2013

ID3 Blues

I primarily use Amarok to play my music. One of my long standing gripe about Amarok is it's inability to read the lyrics from the id3 tags. This was not a major issue since the Amarok's lyrics plugins were able to fetch the lyrics from some external sites. However the online retrieval didn't work when I was listening to some new Malayalam songs[1] as the lyrics was not available online. That was when I tried to modify an Amarok plug in to read lyrics from the tags.

Since I had no experience with Qt Script, extracting lyrics using Qt Script  within the plug in was out of question. I thought of extracting the lyrics from the id3 tags using some utilities to a file and read it from the plug in. Tried to extract the lyrics using id3info and id3v2 but no lyrics[2]! Then I briefly considered writing my on program to extract the USLT frame scrapped the idea when I realized how crazy  the id3 format was.

Now I know why Amarok developers haven't implemented the feature to read the lyrics from the id3 tag. No wonder people consider it is easy to fetch lyrics from online instead of reading from the tags[3]. While reading about the id3 tags, I came across this post from Coding Horror - http://www.codinghorror.com/blog/2006/08/a-spec-tacular-failure.html I couldn't agree more. I guess it is high time someone come up with something simple tagging format instead of the id3 mess.

[1] The songs are from http://onam.eenam.com/. It is a nice album released under CC-BY-NC-ND license.
[2] To my surprise exiftool was able to extract the lyrics from the mp3 files. However I could not find a way to trigger the script that extract the lyrics. Finally I had to trigger the script from conky and the plugin was able to read the extracted lyrics from the output file. Since this was very inefficient, I manually copied the lyrics to Amarok's lyrics tab and solved the problem for the time being.
[3] Clementine & mpd fetch lyrics from online lyrics databases.

November 25, 2013

Create smaller pdf files from pdf files that were generated out of images

Wrote this script a while back to shrink the pdf files provided by Kerala Sahitya Akademi, which were made entirely out of image files.
License : GPLv3

https://github.com/primejyothi/shrinkImgPdf

November 24, 2013

Script to extract list of Wikipedia users

userList.sh is a Bash script to download a XML file that lists the user names from the Malayalam Wikipedia with at least one edit. With appropriate change in the URL, it can be used for other languages Wiki's where the API is supported.

https://github.com/primejyothi/wikiUsers

September 24, 2013

സ്വതന്ത്ര സോഫ്റ്റ്‌‌വേർ

ഒരു ഗൂഗ്ഗിൾ പ്ലസ്സ് പോസ്റ്റിൽ എഴുതിയ കമന്റ് പോസ്റ്റാക്കിമാറ്റുന്നു.

സോഫ്റ്റ്‌‌വെയർ സ്വാതന്ത്ര്യം എന്നത് ദൃഷ്ടിഗോചരമായ മറ്റൂള്ള വസ്തുക്കളുടെ വിപണനവും കോപ്പിറൈറ്റും ആയി താരതമ്യം ചെയ്യതാൽ സ്വതന്ത്ര സോഫ്റ്റ്‌‌വേർ എന്ന ആശയം കുറച്ച് കടന്ന കൈ ആണെന്നു തോന്നും. ഞാൻ ഉണ്ടാക്കിയ ഒരു സാധനം വില തരാതെ മറ്റാരെങ്കിലും എടുത്തുകൊണ്ട് പോയി ഉപയോഗിക്കുന്നതു പോലെ. പക്ഷേ സോഫ്റ്റ്‌‌വേർ എന്നത് അറിവ് എന്ന രീതിയിൽ കണ്ടാൽ കാര്യങ്ങൾ മാറും. അറിവ് മൂടിവയ്ക്കാനുള്ളതല്ല, പങ്കുവയ്ക്കാനുള്ളതാണ് നിലയ്ക് നോക്കിയാൽ ഈ പ്രശ്നമുണ്ടോ?

അപ്പോൾ സാമ്പത്തികം എന്ന പ്രശ്നം വരും. സ്വതന്ത്ര സോഫ്റ്റ്‌‌വേറിൽ നിന്നും പണം ഉണ്ടാക്കാൻ പറ്റില്ല എന്നല്ല, സപ്പോർട്ടും മറ്റുമായി പണം ഉണ്ടാക്കാം. റെഡ്ഹാറ്റ് ആണ് നല്ലൊരുദാഹരണം. എല്ലാവർക്കും റെഡ്ഹാറ്റിനെ പോലെ പണമുണ്ടാക്കാൻ പറ്റുമോ എന്നും എങ്ങനെ എന്നും ചോദിച്ചാൽ പറ്റില്ല എന്നും എനിക്ക് കൃത്യമായി അറിയല്ല എന്നും ആയിരിക്കും എന്റെ ഉത്തരം.

മുമ്പൊരിക്കലുമില്ലാത്ത വിധത്തിൽ സോഫ്റ്റ്‌‌വെയർ നമ്മുടെ ജീവിതത്തെ സ്വാധീനിച്ചുകൊണ്ടിരിക്കുകയാണ്. റെഫ്രിജറേറ്റർ, ടിവി, മൊബൈൽ ഫോൺ എന്നിവയിൽ തുടങ്ങി  സൂപ്പർകമ്പ്യൂട്ടറിൽ വരെ ഓടുന്ന ലിനക്സ് സ്വത്രന്ത്രമല്ലായിരുന്നെങ്കിൽ എങ്ങനെയുണ്ടാകും? ഏതെങ്കിലും കമ്പനി ഉണ്ടാക്കുന്ന സാധനം കാശുകൊടുത്ത് വാങ്ങി ഉപയോഗിക്കേണ്ടി വരും. പൈസ കൊടുക്കുന്നത് ഏറ്റവും ചെറിയ പ്രശ്നമാണ്. ആ സോഫ്റ്റ്‌‌വേറിൽ എന്തെങ്കിലും പ്രശ്നമുണ്ടെങ്കിൽ ഉണ്ടാക്കിയ കമ്പനി കനിയണം. പോരാത്തതിന് അവരുടെ നൂറുകൂട്ടം നിബന്ധനകളും കാണും. ഒന്നു രണ്ട് ഉദാഹരണങ്ങൾ പറയാം. പല സോഫ്റ്റ്‌‌വേറുകളും വില മെഷീനിലെ പ്രോസസ്സറുകളുടെ എണ്ണമനുസ്സരിച്ചാണ് നിർണ്ണയിക്കുന്നത്. പ്രോഗ്രാം എഴുതുന്ന കാര്യമെടുത്താൽ രണ്ടു പ്രോസസ്സറും ഇരുപത് പ്രോസസ്സറും അതിനൊരുപോലെ ആയിരിക്കും. അപ്പോൾ പിന്നെ ഒരേ സാധനം ഞാൻ ഉപയോഗിക്കുന്ന രീതിയനുസ്സരിച്ച് വിലയിടുന്നതിൽ എന്തു ന്യായം? സാമ്പാറിലിടാനാണെങ്കിൽ മുളകിന് അഞ്ചു രൂപ, ചിക്കൻ കറിയിലിടാനാണെങ്കിൽ 7 രൂപ, ബിരിയാണിയിലിടാനാണെങ്കിൽ 10 രൂപ എന്നൊക്കെ പറയുന്നതു പോലെ അല്ലേ? അല്ലെങ്കിൽ വയ്ക്കാനുപയോഗിക്കുന്ന പാത്രത്തിന്റെ അളവു നോക്കി വിലയിട്ടാലോ?

ഇതാ മറ്റൊരു കിടിലം ഐറ്റം. ഓറാക്കിൾ ഡേറ്റാബേസിന്റെ പെർഫോർമൻസ് വിവരങ്ങൾ ഒറാക്കിൾ കമ്പനിയുടെ അനുമതിയില്ലാതെ പ്രസിദ്ധപ്പെടുത്തുവാൻ പാടില്ല. http://www.oracle.com/technetwork/licenses/standard-license-152015.html എന്ന പേജിൽ നിന്നും - "You may not: ... - disclose results of any program benchmark tests without our prior consent." മൈക്രോസോഫ്റ്റിന്റെ എസ് ക്യു എൽ സെർവറിനും ഇതുപോലൊരു നിബന്ധനയുണ്ടായിരുന്നു, ഇപ്പോൾ ഉണ്ടോ എന്നു തീർച്ചയില്ല. (http://contracts.onecle.com/aristotle-international/microsoft-eula.shtml, Performance or Benchmark Testing. You may not disclose the results of any benchmark test of either the Server Software or Client Software for Microsoft SQL Server, Microsoft Exchange Server, or Microsoft Proxy Server to any third party without Microsoft's prior written approval) എന്തെങ്കിലും ഒരു സാധനം കൊള്ളാമോ ഇല്ലയോ എന്ന് ഉണ്ടാക്കിയവൻ അപ്രൂവ് ചെയ്ത റിവ്യൂ നോക്കി തീരുമാനിക്കണം. സാധനം കൊള്ളാമോ ഇല്ലയോ എന്ന് പൊതുജന മധ്യത്തിൽ പറയാൻ പാടില്ല. അത്യാവശ്യമാണെങ്കിൽ കാശുകൊടുത്ത് വാങ്ങി ടെസ്റ്റ് ചെയ്തു നോക്കണം. അത് നമ്മുടെ ആവശ്യത്തിനനുസരിച്ച് ഓടിയാൽ ഊട്ടി ഇല്ലെങ്കിൽ ചട്ടി.  നമ്മുടെ സിനിമാക്കാർ ഇതൊന്നും കാണാതിരിക്കട്ടെ, അല്ലെങ്കിൽ സിനിമ കണ്ട് സത്യസന്ധമായ റിവ്യൂ എഴുതുന്ന പരിപാടി നിന്നുപോകും.

മറ്റൊരുകാര്യം - സപ്പോർട്ട്. സോഫ്റ്റ്‌‌വെയർ എത്രകാലം സപ്പോർട്ട് ചെയ്യണമെന്ന് അതുണ്ടാക്കുന്ന കമ്പനികൾ തീരുമാനിക്കും. ഇനി കഷ്ടകാലത്തിനോ/നല്ലകാലത്തിനോ നമ്മൾ പുതിയ മെഷീൻ വാങ്ങുകയോ, ഓപ്പറേറ്റിങ് സിസ്റ്റം അപ്‌‌ഗ്രേഡ് ചെയ്യുകയോ ചെയ്താൽ നേരത്തേ വാങ്ങിയ സോഫ്റ്റ്‌‌വേർ പുതിയ മെഷീനിൽ/ഓഎസിൽ പ്രവർത്തിക്കുമോ എന്ന് ഒരു ഉറപ്പുമില്ല. ചിലപ്പോൾ സോഫ്റ്റ്‌‌വേറിന്റെ പുതിയ വെർഷൻ ഓടണമെങ്കിൽ പുതിയ മെഷീൻ വാങ്ങേണ്ടി വരും. ഞാൻ പണ്ട് വാങ്ങിയ ഒരു സ്കാനർ ഉണ്ട് കൈയ്യിൽ, ഇപ്പോഴും കുഴപ്പമൊന്നുമില്ല. വിൻഡോസ് വിസ്റ്റ ഉള്ള ഒരു ലാപ്‌‌ടോപ്പ് വാങ്ങിയപ്പോൾ ചെറിയ ഒരു പ്രശ്നം. സ്കാനറിന്റെ ഡ്രൈവർ വിസ്റ്റ സപ്പോർട്ട് ചെയ്യില്ല. അതു കാരണം ഇപ്പോഴും ഒരു പഴയ വിൻഡോസ് ഉപയോഗിക്കാൻ ഞാൻ നിർബന്ധിതനായിരിക്കുന്നു.

സ്വതന്ത്ര സോഫ്റ്റ്‌‌വേറുകളുടെ മറ്റൊരു ഗുണം അവയുടെ സോഴ്സ് കോഡ് ആർക്കുവേണമെങ്കിലും വായിക്കുകയും മാറ്റം വരുത്തുകയും ചെയ്യാമെന്നാണ്. ഒരു സാധനം എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്നത് കണ്ടുപിടിക്കുന്നത് വളരെയധികം ഉപയോഗമുള്ള കാര്യമാണ്. ഒരു കാർ/ബൈക്ക് എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്ന് ആരെങ്കിലും പറഞ്ഞു തരുന്നതും അത് ഓടിച്ചു നോക്കി അല്ലെങ്കിൽ അഴിച്ചു നോക്കി മനസ്സിലാക്കുന്നതും പോലെയുള്ള വ്യത്യാസം. ഇങ്ങനെ ഒരു കാര്യം മനസ്സിലാക്കാൻ വേണ്ടി ഇറങ്ങിപ്പുറപ്പെടുമ്പോൾ പഠിക്കുന്ന മറ്റുകാര്യങ്ങൾ ബോണസ്സും. കുറച്ചു നാൾ മുമ്പ് ഞാൻ ടാബിലും കംപ്യൂട്ടറിലുമായി ഉപയോഗിക്കുന്ന രണ്ട് സോഫ്റ്റ്‌‌വേറുകളുടെ ഡേറ്റാബേസുകൾ തമ്മിൽ സിങ്ക് ചെയ്യാൻ ഒരു യൂട്ടിലിറ്റി എഴുതി. ഈ പറഞ്ഞ രണ്ടു സോഫ്റ്റ്‌‌വേറുകളും ഓപ്പൺ സോഴ്സ് ആയിരുന്നതിനാൽ അതിന്റെ കോഡ് വായിച്ച് വിശദ വിവരങ്ങൾ മനസ്സിലാക്കാൻ പറ്റിയതിനാൽ യൂട്ടിലിറ്റി ഉണ്ടാക്കാൻ പറ്റി. അല്ലായിരുന്നെങ്കിൽ ഒന്നും നടക്കില്ലായിരുന്നു.

ഇനിയും വളരെയധികം കാരണങ്ങളുണ്ട്. കൂടുതൽ വിവരങ്ങൾക്ക് http://www.gnu.org/philosophy/philosophy.html, http://www.gnu.org/philosophy/why-free.html, http://www.gnu.org/philosophy/pragmatic.html എന്നിവ കാണുക.

September 7, 2013

റിമൈന്ററുകൾ

ചില കമാന്റുകൾ കൃത്യസമയത്ത് എക്സിക്യൂട്ട് ചെയ്തില്ലെങ്കിൽ നമ്മുടെ ജീവിതം കട്ടപ്പൊകയായേക്കും. ഉദാ:
"അടുപ്പത്തിരിക്കുന്ന കൂക്കർ ഏഴെട്ടു മിനിട്ടു കഴിഞ്ഞ് ഓഫ് ചെയ്തേക്കണേ, ഞാൻ കടയിൽ പോയിട്ടു വരാം" അല്ലെങ്കിൽ "പാൽ തണുക്കാൻ വച്ചിട്ടുണ്ട്, പത്തുമിനിട്ട് കഴിഞ്ഞിട്ട് കൊച്ചിനു കൊടുക്കണം കേട്ടോ?"

എന്തെങ്കിലും കാര്യമായി ചെയ്തുകൊണ്ടിക്കുന്ന സമയത്ത് ഇങ്ങനയുള്ളവയ്ക്ക് റിമൈന്റെർ വച്ചില്ലെങ്കിൽ മറന്നുപോവുകയാണ് പതിവ്. ആദ്യമൊക്കെ ഒരു ഷെല്ലിൽ sleep 5m, sleep 10m എന്നൊക്കെ കൊടുത്തിരുന്നെങ്കിലും ടൈമൗട്ട് ആയോന്നറിയാൻ ടെർമിനൽ വിൻഡോയിൽ ഇടയ്ക്ക് പോകണമായിരുന്നു. (ഹാർഡ്വെയർ പ്രശ്നം കാരണം എക്കോ ഉപയോഗിച്ച് ബീപ് ചെയ്യാൻ എന്റെ മെഷീനിൽ പറ്റില്ല). പിന്നെ ഉള്ള ഒരു മാർഗ്ഗം ഏതെങ്കിലും കലണ്ടർ/റ്റു ഡു ആപ്ലിക്കേഷനിൽ റിമൈന്റർ സെറ്റു ചെയ്യുക എന്നതായിരുന്നു. ആപ്ലിക്കേഷനൊക്കെ ഓപ്പൺ ചെയ്തിട്ട്, റിമൈന്റർ സെറ്റ് ചെയ്യാൻ 5:55 നോട് എഴല്ലെങ്കിൽ എട്ട് മിനിട്ട് കൂട്ടിയാൽ അഞ്ച് അറുത്തിരണ്ട് അല്ലെങ്കിൽ അഞ്ച് അറുപത്തി മൂന്നിന് എന്നൊക്കെ കണക്കുകൂട്ടി ഒരു തീരുമാനമാകുമ്പോഴേയ്ക്കും കൊച്ചിനെ അടുപ്പത്തു നിന്നിറക്കിവയ്ക്കാനാണോ അതോ കുക്കറിനു പാലുകൊടുക്കാനാണോ റിമൈന്റർ സെറ്റ് ചെയ്യേണ്ടതെന്നു കൺഫ്യൂഷനാകും. അപ്പോൾ പിന്നെ പെട്ടെന്നു ചെയ്യാൻ പറ്റൂന്നത് ഒരു മെസ്സേജ് പോപ്അപ് ചെയ്യിക്കുക എന്നതാണ്. xmessage ആണ് ഇതിനായി ആദ്യം ഉപയോഗിച്ചു നോക്കിയത്.
sleep 7m; xmessage "Some text"
ഇതിലെ പ്രശ്നം എന്തെന്നാൽ xmessage ന്റെ വിൻഡോ വളരെ ചെറുതായതിനാൽ അത് വരുന്നത് ശ്രദ്ധയിൽപെടില്ല എന്നതാണ്. പകരം ഉപയോഗിക്കാൻ പറ്റുമെന്നു തോന്നിയ dialog കമാന്റിന്റെ മാൻ പേജ് കണ്ടു പേടിച്ചു, kdialog നു മാൻ പേജുണ്ടായിരുന്നുമില്ല. അവസാനം zenityയാണ് നമുക്ക് പറ്റിയതെന്ന തീരുമാനത്തിലെത്തി.
zenity --info --text "Some message" അത്യാവശ്യം നല്ല ഒരു മെസ്സേജ് കാണിക്കുന്നുണ്ടായിരുന്നു. പിന്നെ താമസിച്ചില്ല താഴെ കാണുന്ന ഷെൽ സ്ക്രിപ്റ്റ് remind.sh എന്ന പേരിൽ എഴുതി വച്ചു:
#! /usr/bin/bash
# Script to pop up a message after predefined time

if [[ $# -lt 2 ]]
then
        echo "Usage : `basename $0` time message"
        exit 1
fi
sleepTime=$1
shift

(sleep ${sleepTime}; zenity --info --text "$*") &
ഈ സ്ക്രിപ്റ്റ് ഹോം ഫോൾഡറിലെ bin എന്ന ഫോൾഡറിലാണുള്ളതെങ്കിൽ krunner ഇൽ (alt+f2 in KDE) ~/bin/remind.sh 5m "how are you?" എന്നു കൊടുത്താൽ അഞ്ചുമിനിട്ടു കഴിഞ്ഞ് മെസ്സേജ് വരും.

കുറിപ്പ് 1: ഇത് ടെർമിനലിൽ നിന്നും റൺ ചെയ്താൽ റൺ ചെയ്ത ശേഷം ടെർമിനൽ ക്ലോസ് ചെയ്തില്ലെങ്കിൽ മെസ്സേജ് കാണാൻ വേണ്ടി ആ ടെർമിനലിലേക്ക് തന്നെ പോകേണ്ടി വരുന്നുണ്ട്. അതുകൊണ്ട് ടെർമിനലിൽ നിന്നും റൺ ചെയ്യുകയാണെങ്കിൽ ആ ടെർമിനൽ ക്ലോസ് ചെയ്യുക.

കുറിപ്പ് 2 : ഇതിനേക്കാൾ എളുപ്പമുള്ള വഴികൾ ഉണ്ടെങ്കിൽ ദയവായി പറയുക.