How to install the stemmer4r gem on Mac OS X and Linux
The stemmer4r gem is fubar. Warning draft snippet…
1 # gem install stemmer4r 2 Bulk updating Gem source index for: http://gems.rubyforge.org 3 Building native extensions. This could take a while... 4 ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError) 5 ERROR: Failed to build gem native extension. 6 7 ruby extconf.rb install stemmer4r 8 9 Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6 for inspection. 10 Results logged to /usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6/ext/stemmer4r/gem_make.out 11 12 13 1. Change path of Ruby executable 14 15 cd /usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6/ext/stemmer4r/ 16 vim extconf.rb 17 18 #!/usr/bin/ruby -w 19 20 to 21 22 #ruby -w 23 24 2. Compile libstemmer_c 25 26 cd /usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6/ext/stemmer4r/libstemmer/ 27 make 28 29 3. Compile stemmer4r 30 31 cd /usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6/ext/stemmer4r/ 32 33 Change path: 34 /usr/local/ruby/lib/ruby/1.8/i686-linux/ 35 To: 36 /usr/lib/ruby/1.8/x86_64-linux/ 37 38 Or wherever you have it installed 39 40 ruby extconf.rb 41 42 43 4. Build stemmer4r gem 44 45 46 gem build stemmer4r.gemspec 47 48 gem install stemmer4r-0.6.gem 49 50 51 Problems 52 53 gcc -shared -rdynamic -Wl,-export-dynamic -L"/usr/lib" -o stemmer4r.so stemmer4r.o libstemmer_c/libstemmer.o -lruby1.8 -lpthread -ldl -lcrypt -lm -lc 54 /usr/bin/ld: libstemmer_c/libstemmer.o(libstemmer.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 55 libstemmer_c/libstemmer.o: could not read symbols: Bad value 56 collect2: ld returned 1 exit status 57 make: *** [stemmer4r.so] Error 1 58 59 60 Add CFLAGS: 61 62 root@aktagon:/usr/lib/ruby/gems/1.8/gems/stemmer4r-0.6/ext/stemmer4r/libstemmer_c# make 63 include mkinc.mak 64 CFLAGS = -fPIC 65 libstemmer.o: $(snowball_sources:.c=.o) 66 $(AR) -cru $@ $^ 67
Installing/compiling and using git with Ruby on Rails (on Mac OS X Leopard and Debian Linux)
Git is a good alternative to Mercurial, and of course SVN or CVS if you’re still using stone age tools, so in this post I’ll show you how to compile, install and use git with Rails.
Installing git on Mac OS X
First compile and install git:
1 cd /usr/local/src 2 wget http://kernel.org/pub/software/scm/git/git-1.5.4.4.tar.bz2 3 tar jxvf git-1.5.4.4.tar.bz2 4 cd git-1.5.4.4 5 make prefix=/usr/local all 6 make prefix=/usr/local test && echo $? 7 sudo make prefix=/usr/local install
Installing git on Debian
On a Debian installation install git by first executing the following commands:
$ sudo apt-get install git-coreNote that the package name is git-core not git.
If you want the latest and greatest version, you first need to install the dependencies (note that you can leave out tk and expat):
1 sudo apt-get install curl 2 sudo apt-get install libcurl3 3 sudo apt-get install libcurl3-dev 4 sudo apt-get install tk8.4 5 sudo apt-get install cpio expat 6 sudo apt-get install zlib 7 sudo apt-get install build-essential 8 sudo apt-get install zlib1g-dev 9 sudo apt-get install asciidoc 10 sudo apt-get install xmlto
Then compile and install:
1 NO_EXPAT=yes NO_SVN_TESTS=yes NO_IPV6=yes NO_TCLTK=yes make -j2 prefix=/usr all 2 NO_EXPAT=yes NO_SVN_TESTS=yes NO_IPV6=yes NO_TCLTK=yes make -j2 prefix=/usr install
Configuring git
Run these commands to tell git your name and email:
1 git config --global user.name "u name" 2 git config --global user.email x@x.com
Otherwise, you might get this error:
1 *** Environment problem: 2 *** Your name cannot be determined from your system services (gecos). 3 *** You would need to set GIT_AUTHOR_NAME and GIT_COMMITTER_NAME 4 *** environment variables; otherwise you won't be able to perform 5 *** certain operations because of "empty ident" errors. 6 *** Alternatively, you can use user.name configuration variable. 7 8 fatal: empty ident <........@........com> not allowed 9 fatal: The remote end hung up unexpectedly
If you like colorized command output execute these commands:
1 git config --global color.diff auto 2 git config --global color.status auto 3 git config --global color.branch auto
Using git
If all goes well, change to your project directory and run the following commands:
1 git init
This creates the git repository, so we’re now ready to start adding files to it, but first we need to create the git ignore file, which tells git to ignore certain files completely:
1 cat <<EOF<<EOF > .gitignore 2 config/database.yml 3 db/*.sqlite3 4 log/*.log 5 tmp/**/* 6 .DS_Store 7 doc/api 8 doc/app 9 EOFEOF
By default git doesn’t add empty directories—sucks if you ask me—so we’ll create a dummy file in all empty directories with the find and touch commands:
1 find . \( -type d -empty \) -and \( -not -regex ./\.git.* \) -exec touch {}/.gitignore \;
Importing files
We’re now ready to start adding and commiting files, so without thinking execute:
1 git add . 2 git commit -m 'initial import'
This creates the git repository, adds and commits all files that are in the current folder.
Using remote repositories
If you’re like me you’ll want to use a remote repository, so let’s continue the exercise by creating the repository folder on the remote server (Note that commands are executed on the remote server from now on):
1 mkdir /var/lib/git/repositories/project_name
We want the folder to be accessible by users belonging to the git group only:
1 addgroup git 2 chown root.git /var/lib/git/repositories/project_name 3 chmod 770 /var/lib/git/repositories/project_name
Now add yourself—or the user you’ll be using to connect to the remote server—to the git group:
1 usermod -a -G git your_username
Alternatively create a new user:
1 useradd -g git your_username
Now we’re finally ready to copy the local repository to the remote server, which is done with the scp command (Note that commands are executed locally again from now on):
1 scp -rp .git user@server://var/lib/git/repositories/project_name
To let git know that this repository exists we’ll use the git remote command:
1 git remote add project_name ssh://server/var/lib/git/repositories/project_name
This adds the information to .git/config, which might be good to have a quick look at.
Note that if you’re using a non-standard SSH port you need to add the following to your ~/.ssh/config file:
1 Host server 2 Port 1234
Commit files and push them to the remote server
Now change a file and commit and push the changes to the remote server:
1 git commit -m "Me be sleepy" 2 git push project_name
If you get an error such as this it means you need to install git:
1 $ git push project_name 2 username@server's password: 3 sh: git-receive-pack: command not found 4 fatal: The remote end hung up unexpectedly
That’s all…
Miscellaneous problems
error: unable to create temporary sha1 filename ./objects/obj_FUu2jb: Permission denied
Resources
http://jointheconversation.org/railsgit
http://devblog.michaelgalero.com/2007/12/17/my-git-notes-for-rails/
http://railscasts.com/episodes/96
http://groups.google.com/group/rails-oceania/browse_thread/thread/2c8611dc93917952/e175f72310823547
http://www.kernel.org/pub/software/scm/git/docs/tutorial.html
http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way
nginx startup script for Debian
1 sudo vim /etc/init.d/nginx
Paste in the following (remember to run ‘set :paste’ in VIM when pasting):
1 #! /bin/sh 2 ## 3 # nginx start script 4 ## 5 6 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 7 DAEMON=/usr/local/sbin/nginx 8 NAME=nginx 9 DESC=nginx 10 11 if [ ! -x $DAEMON ] 12 then 13 echo "Couldn't find $DAEMON. Please set path to DAEMON." 14 exit 0 15 fi 16 17 18 # Include nginx defaults if available 19 if [ -f /etc/default/nginx ] ; then 20 . /etc/default/nginx 21 fi 22 23 set -e 24 25 case "$1" in 26 start) 27 echo -n "Starting $DESC: " 28 start-stop-daemon --start --pidfile /var/run/$NAME.pid \ 29 --exec $DAEMON -- $DAEMON_OPTS 30 echo "$NAME." 31 ;; 32 stop) 33 echo -n "Stopping $DESC: " 34 start-stop-daemon --stop --pidfile /var/run/$NAME.pid \ 35 --exec $DAEMON 36 echo "$NAME." 37 ;; 38 restart|force-reload) 39 echo -n "Restarting $DESC: " 40 start-stop-daemon --stop --pidfile \ 41 /var/run/$NAME.pid --exec $DAEMON 42 sleep 1 43 start-stop-daemon --start --pidfile \ 44 /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS 45 echo "$NAME." 46 ;; 47 reload) 48 echo -n "Reloading $DESC configuration: " 49 start-stop-daemon --stop --signal HUP --pidfile /var/run/$NAME.pid \ 50 --exec $DAEMON 51 echo "$NAME." 52 ;; 53 *) 54 N=/etc/init.d/$NAME 55 echo "Usage: $N {start|stop|restart|force-reload}" >&2 56 exit 1 57 ;; 58 esac 59 60 exit 0
Now make the script executable with this command:
1 sudo chmod 755 /etc/init.d/nginx
Lastly, run this command to make the script run when the server starts and stops:
1 sudo /usr/sbin/update-rc.d -f nginx defaults
Getting WLAN to work on a Fujitsu Amilo laptop is difficult...
I fought and won over WLAN drivers and Linux, but later switched to using a Mac, because driver support for WLAN , printers and other hardware is non-existent Linux:
1 apt-get install wpasupplicant 2 3 http://ubuntuforums.org/showthread.php?t=313914 4 5 vim /etc/wpa_supplicant.conf 6 7 ctrl_interface=/var/run/wpa_supplicant 8 ctrl_interface_group=0 9 eapol_version=1 10 ap_scan=2 11 fast_reauth=1 12 13 14 network={ 15 ssid="...yer-ssid..." 16 scan_ssid=1 17 proto=WPA 18 key_mgmt=WPA-PSK 19 psk="...yer-pass..." 20 priority=5 21 pairwise=TKIP 22 } 23 24 vim /etc/network/interfaces 25 26 auto lo 27 iface lo inet loopback 28 29 auto eth1 30 iface eth1 inet dhcp 31 wpa-driver wext 32 wpa-conf /etc/wpa_supplicant.conf 33 34 auto wlan0 35 iface wlan0 inet dhcp 36 37 iface eth0 inet dhcp 38 39 auto eth0 40 41 vim /etc/init.d/wpasupplicant 42 43 #!/bin/sh 44 45 PATH=/usr/sbin:/usr/bin:/sbin:/bin 46 47 case "$1" in 48 start|restart|force-reload) 49 wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf -dd -B 50 ;; 51 stop) 52 killall -9 wpa_supplicant 53 ;; 54 *) 55 echo "Usage: $0 {start|stop|restart|force-reload}" >&2 56 exit 3 57 ;; 58 esac 59 60 exit 0 61 62 ---------------- 63 64 chmod +x ... 65 cd /etc/rcS.d 66 ln -s ../init.d/wpasupplicant S40iwpa 67 68 69 ------------- 70 71 auto lo 72 iface lo inet loopback 73 74 auto eth1 75 iface eth1 inet dhcp 76 77 auto wlan0 78 iface wlan0 inet dhcp
Check if a file or directory exists with bash
This script tests if nginx exists and is executable. The script prints a warning and exits, if nginx doesn’t exists or isn’t executable:
1 DAEMON=/usr/local/sbin/nbinx 2 if [ ! -x $DAEMON ] 3 then 4 echo "Couldn't find $DAEMON. Please set path to DAEMON." 5 exit 0 6 fi
See man test for more information on how to use the test command.