Tarring up the oldstuff

cat-town
Dan Buch 4 years ago
parent aa1345b6ed
commit da7a8f5c14
Signed by: meatballhat
GPG Key ID: 9685130D8B763EA7

Binary file not shown.

@ -1,14 +0,0 @@
BINDIR := $(PWD)/bin
CFLAGS := -std=c99 -Wall -g
export BINDIR CFLAGS
all:
cd src && $(MAKE)
clean:
rm -f bin/*
.PHONY: all clean

@ -1,10 +0,0 @@
# Practicing Algorithms
I've been burned enough times when in a room with a bunch of CS Majors...
(grumble.)
## MIT Open Courseware stuff
It's just like bookmarks, but on github!
- <a href="http://videolectures.net/mit6046jf05_leiserson_lec01/">Intro. to Algorithms lecture 01</a>

@ -1,10 +0,0 @@
#!/bin/bash
SETUP="import sorting"
LIST="$(python -c "import random;l = list(range(0, ${1-5000}));random.shuffle(l);print(l)")"
echo -n "insertion sort: "
python -m timeit -s "$SETUP" "sorting.insertion_sort($LIST)"
echo -n "merge sort: "
python -m timeit -s "$SETUP" "sorting.merge_sort($LIST)"

@ -1,49 +0,0 @@
# vim:fileencoding=utf-8
import math
def insertion_sort(a):
""" Θ(n^2) """
for j in range(1, len(a)):
key = a[j]
i = j - 1
while i >= 0 and a[i] > key:
a[i + 1] = a[i]
i = i - 1
a[i + 1] = key
def merge_sort(m):
n = len(m)
if n <= 1:
return m
middle = math.ceil(n / 2)
left = m[:middle]
right = m[middle:]
left = merge_sort(left)
right = merge_sort(right)
return merge(left, right)
def merge(left, right):
result = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
elif len(left) > 0:
result.append(left.pop(0))
elif len(right) > 0:
result.append(right.pop(0))
return result

@ -1,12 +0,0 @@
def insertion_sort(a)
(0..(a.length - 1)).each do |j|
key = a[j]
i = j - 1
while (i >= 0) && (a[i] > key)
a[i + 1] = a[i]
i = i - 1
end
a[i + 1] = key
end
end

@ -1,8 +0,0 @@
all: $(BINDIR)/insertion-sort
$(BINDIR)/insertion-sort: insertion-sort.c
gcc -o $@ $(CFLAGS) $^
.PHONY: all

@ -1,38 +0,0 @@
#include <stdio.h>
void insertion_sort(int * a, int len_a);
int
main(int argc, char ** argv)
{
int i;
int l[] = {1, 4, 8, 9, 2, 3};
insertion_sort(l, 6);
for (i = 0; i < 6; i++) {
printf("%d\n", l[i]);
}
}
void
insertion_sort(int * a, int len_a)
{
int i, j, key;
for (j = 1; j < len_a; j++) {
key = a[j];
i = j - 1;
while ((i >= 0) && (a[i] > key)) {
a[i + 1] = a[i];
i = i - 1;
}
a[i + 1] = key;
}
}
/* vim:filetype=c
*/

@ -1,90 +0,0 @@
import random
import unittest
import sorting
class TestInsertionSort(unittest.TestCase):
def test_example(self):
tmpl = [8, 2, 4, 9, 3, 6]
a = tmpl[:]
expected = [2, 3, 4, 6, 8, 9]
sorting.insertion_sort(a)
self.assertEqual(expected, a)
def test_100_example(self):
tmpl = list(range(0, 1000))
a = tmpl[:]
random.shuffle(a)
expected = tmpl[:]
sorting.insertion_sort(a)
self.assertEqual(expected, a)
def test_reversed_100_example(self):
tmpl = list(range(0, 1000))
a = list(reversed(tmpl[:]))
expected = tmpl[:]
sorting.insertion_sort(a)
self.assertEqual(expected, a)
def test_1000_example(self):
tmpl = list(range(0, 1000))
a = tmpl[:]
random.shuffle(a)
expected = tmpl[:]
sorting.insertion_sort(a)
self.assertEqual(expected, a)
class TestMergeSort(unittest.TestCase):
def test_example(self):
tmpl = [8, 2, 4, 9, 3, 6]
a = tmpl[:]
expected = [2, 3, 4, 6, 8, 9]
actual = sorting.merge_sort(a)
self.assertEqual(expected, actual)
def test_100_example(self):
tmpl = list(range(0, 1000))
a = tmpl[:]
random.shuffle(a)
expected = tmpl[:]
actual = sorting.merge_sort(a)
self.assertEqual(expected, actual)
def test_reversed_100_example(self):
tmpl = list(range(0, 1000))
a = list(reversed(tmpl[:]))
expected = tmpl[:]
actual = sorting.merge_sort(a)
self.assertEqual(expected, actual)
def test_1000_example(self):
tmpl = list(range(0, 1000))
a = tmpl[:]
random.shuffle(a)
expected = tmpl[:]
actual = sorting.merge_sort(a)
self.assertEqual(expected, actual)
if __name__ == '__main__':
unittest.main()

@ -1,14 +0,0 @@
require 'test/unit'
require 'sorting'
class TestSorting < Test::Unit::TestCase
def test_insertion_sort
tmpl = [8, 2, 4, 9, 3, 6]
a = Array.new(tmpl)
expected = [2, 3, 4, 6, 8, 9]
insertion_sort(a)
assert_equal(expected, a)
end
end

@ -1,2 +0,0 @@
export ANDROID_HOME="${ANDROID_HOME-"$HOME/opt/android-sdk-linux"}"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mbh"
android:versionCode="1"
android:versionName="1.0">
<application android:label="@string/app_name" >
<activity android:name="HelloAndroid"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

@ -1,17 +0,0 @@
# This file is used to override default values used by the Ant build system.
#
# This file must be checked in Version Control Systems, as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' for the location of your java source folder and
# 'out.dir' for the location of your output folder.
# You can also use it define how the release builds are signed by declaring
# the following properties:
# 'key.store' for the location of your keystore and
# 'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloAndroid" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
unless="sdk.dir"
/>
<!-- extension targets. Uncomment the ones where you want to do custom work
in between standard targets -->
<!--
<target name="-pre-build">
</target>
<target name="-pre-compile">
</target>
/* This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir} */
<target name="-post-compile">
</target>
-->
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

@ -1,10 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked in Version Control Systems,
# as it contains information specific to your local configuration.
# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=/home/me/opt/android-sdk-linux

@ -1,40 +0,0 @@
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

@ -1,11 +0,0 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-10

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloAndroid"
/>
</LinearLayout>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloAndroid</string>
</resources>

@ -1,16 +0,0 @@
package com.mbh;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}

@ -1,6 +0,0 @@
*
!gowrikumar/bin
!gdbtut/bin
!*.i
!*.s
!*.c

@ -1,21 +0,0 @@
CD = cd
RM = rm -v
CC := gcc
CFLAGS := -std=c99 -Wall -g
ALL_TARGETS := $(patsubst %.c,%,$(wildcard *.c))
export CD RM CFLAGS
all: $(ALL_TARGETS)
$(CD) gowrikumar && $(MAKE)
$(CD) gdbtut && $(MAKE)
clean:
$(CD) gowrikumar && $(MAKE) clean
$(CD) gdbtut && $(MAKE) clean
.PHONY: all clean

@ -1,3 +0,0 @@
I don't get paid to write C for a living, so I have to sneak in practice here
and there. Maybe once the kiddo goes to college I can become a kernel hacker
:-P (assuming there's still such a thing as a kernel.)

@ -1,14 +0,0 @@
# tutorial exercises from http://www.unknownroad.com/rtfm/gdbtut/
BINDIR := $(PWD)/bin
export BINDIR
all:
$(CD) src && $(MAKE)
clean:
$(RM) $(BINDIR)/*
.PHONY: all clean

@ -1,12 +0,0 @@
# tutorial exercises from http://www.unknownroad.com/rtfm/gdbtut/
ALL_BIN := $(patsubst %.c,$(BINDIR)/%,$(wildcard *.c))
$(BINDIR)/%: %.c
$(CC) $(CFLAGS) -o $@ $<
all: $(ALL_BIN)
.PHONY: all

@ -1,28 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *buf;
long long huge = 8000000000000000000;
/* Okay, so this is *not* going to segfault because
* the way memory is allocated has changed since
* the tutorial was written. The segfault is supposed
* to happen when more memory is allocated than is
* available on the machine. So much for that exercise.
*/
buf = malloc(huge);
fgets(buf, 1024, stdin);
printf("%s\n", buf);
return 1;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,14 +0,0 @@
# puzzles from http://www.gowrikumar.com/c/
BINDIR := $(PWD)/bin
export BINDIR
all:
$(CD) src && $(MAKE)
clean:
$(RM) $(BINDIR)/*
.PHONY: all clean

@ -1,23 +0,0 @@
#include <stdio.h>
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS sizeof(array) / sizeof(array[0])
int main()
{
int d;
#ifdef DEBUG
printf("sizeof(array) = %d\n", TOTAL_ELEMENTS);
#endif
for (d = 0; d < TOTAL_ELEMENTS ; d++)
printf("%d\n", array[d]);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,20 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d\n", i);
} while(++i < 15);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,22 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("(Hit ^C to stop the madness.)\n");
while(1)
{
fprintf(stdout, "hello-out ");
fprintf(stderr, "hello-err ");
sleep(1);
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,23 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("This time we'll include \\n!\n");
printf("(Hit ^C to stop the madness.)\n");
while(1)
{
fprintf(stdout, "hello-out\n");
fprintf(stderr, "hello-err\n");
sleep(1);
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,24 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("This time we'll flush stdout!\n");
printf("(Hit ^C to stop the madness.)\n");
while(1)
{
fprintf(stdout, "hello-out ");
fprintf(stderr, "hello-err ");
fflush(stdout);
sleep(1);
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,19 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#define f(a, b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
printf("%s\n", h(f(1, 2)));
printf("%s\n", g(f(1, 2)));
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,42 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#define f(a, b) a##b
#define g(a) #a
#define h(a) g(a)
#define border(c) \
for (int i = 0; i < 60; i++) { \
printf(c); \
} \
printf("\n");
int main()
{
printf("%s\n", h(f(1, 2)));
printf("%s\n", g(f(1, 2)));
printf("%s\n", g(printf("dogs rule cats drool\n")));
char * hambones = "Cats! " g(ham);
char * bonesham = "Meats! " g(bones);
char * tmp;
border("-");
printf("bonesham = %s\n", bonesham);
printf("hambones = %s\n", hambones);
border("-");
tmp = f(ham, bones);
f(ham, bones) = f(bones, ham);
f(bones, ham) = tmp;
printf("bonesham = %s\n", bonesham);
printf("hambones = %s\n", hambones);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,24 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include<stdio.h>
int main()
{
int a=10;
switch(a)
{
case '1':
printf("ONE\n");
break;
case '2':
printf("TWO\n");
break;
defa1ut:
printf("NONE\n");
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,32 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#define MAGIC_NUMBER 10
#include<stdio.h>
int main()
{
int a = MAGIC_NUMBER;
switch(a)
{
case '1':
printf("ONE\n");
break;
case '2':
printf("TWO\n");
break;
defalut:
printf("NO CAN SPELL\n");
break;
defau1t:
printf("SO CLOSE, YET SO FAR\n");
break;
default:
printf("NONE\n");
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,16 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdlib.h>
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,29 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdlib.h>
#include <stdio.h>
int main()
{
int* p;
size_t size_of_int = sizeof(int);
printf("sizeof(int) = %d\n", size_of_int);
p = (int*)malloc(sizeof(int));
size_t size_of_p = sizeof(p);
printf("sizeof(p) = %d\n", size_of_p);
*p = 10;
size_t size_of_ptr_p = sizeof(*p);
printf("sizeof(*p) = %d\n", size_of_ptr_p);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,40 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
static unsigned int mask[] = {
0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF
};
int get_bit_count(unsigned int x)
{
int i;
int shift; /* Number of positions to shift to right*/
for (i = 0, shift = 1; i < 5; i++, shift *= 2) {
x = (x & mask[i]) + ((x >> shift) & mask[i]);
}
return x;
}
int main()
{
int to_test[] = {0, 5, 7};
int current;
for (int i = 0; i < 3 ; i++) {
current = to_test[i];
printf("get_bit_count(%d) = %d\n", current, get_bit_count(current));
}
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,67 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
static unsigned int mask[] = {
0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF
};
int get_bit_count(unsigned int x)
{
printf("get_bit_count(%d)\n", x);
int i;
int x_and_mask;
int x_shifted;
int x_shifted_and_mask;
int shift; /* Number of positions to shift to right*/
for (i = 0, shift = 1; i < 5; i++, shift *= 2) {
printf(" START loop\n");
printf(" i = %d, x = %d, shift = %d\n", i, x, shift);
x_and_mask = x & mask[i];
printf(" x & mask[i] = %d\n", x_and_mask);
x_shifted = x >> shift;
printf(" x >> shift = %d\n", x_shifted);
x_shifted_and_mask = x_shifted & mask[i];
printf(" (x >> shift) & mask[i] = %d\n", x_shifted_and_mask);
x = x_and_mask + x_shifted_and_mask;
printf(" x = %d\n", x);
printf(" END loop\n");
}
return x;
}
int main()
{
int to_test[] = {0, 5, 7};
int current;
/*
size_t mask_len = sizeof(mask) / sizeof(unsigned int);
for (int i = 0; i < mask_len; i++) {
printf("mask[%d] = %d\n", i, mask[i]);
}
*/
for (int i = 0; i < 3 ; i++) {
current = to_test[i];
printf("get_bit_count(%d) -> %d\n", current, get_bit_count(current));
}
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,26 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int main()
{
float f = 0.0f;
int i;
for (i = 0; i < 10; i++) {
f = f + 0.1f;
}
if (f == 1.0f) {
printf("f is 1.0 \n");
} else {
printf("f is NOT 1.0\n");
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,43 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
#include <math.h>
int main()
{
float f = 0.0f;
int i;
for (i = 0; i < 10; i++) {
f = f + 0.1f;
}
if (f == 1.0) {
printf("f is 1.0 \n");
/* nope! */
}
if (f == 1.000000) {
printf("f is perhaps 1.000000?\n");
/* nope again */
}
printf("f is neither 1.0 nor 1.000000\n");
printf("(f is really %.24f)\n", f);
printf("OH NOES!\n");
printf("But...\n");
double difference = fabs(f - 1.000000);
if (difference < 0.00001) {
printf("f is close enough to 1.000000 (off by %.24f)\n", difference);
/* yes? */
}
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,20 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int main()
{
/* FIXME: the comma after "a = 1" makes the compiler angry. Either the
* ", 2" should be removed or another assignment should be added.
int a = 1, 2;
*/
int a = 1, b = 2;
printf("a: %d\n", a);
printf("b: %d\n", b);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,15 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int main()
{
int i = 43;
printf("%d\n", printf("%d", printf("%d", i)));
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,17 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int main()
{
int i = 43, nprinted;
nprinted = printf("%d\n", printf("%d", printf("%d", i)));
nprinted = printf("(the last one was %d characters)\n", nprinted);
nprinted = printf("(and that was %d characters)\n", nprinted);
return 0;
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,37 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
void duff(register char *to, register char *from, register int count)
{
register int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while (--n > 0);
}
}
int main()
{
char * to = "dogs cats babies";
char * from = "monkey hat pants";
int i = 16;
printf("to = %s\n", to);
printf("from = %s\n", from);
/* And here comes the segfault... */
duff(to, from, i);
printf("to = %s\n", to);
printf("from = %s\n", from);
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,40 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
void duff(register char *to, register char *from, register int count)
{
register int n;
int remainder = count % 8;
if (remainder == 0) {
n = (count + 7) / 8;
do {
*to++ = *from++;
} while (--n > 0);
} else if (remainder <= 7 && remainder > 0) {
int i;
int c;
for (i = 0; (c = from[i] && c != EOF); i++) {
to[i] = c;
}
}
}
int main()
{
char * to = "dogs cats babies";
char * from = "monkey hat pants";
int i = 11;
printf("to = %s\n", to);
printf("from = %s\n", from);
/* And here comes the segfault... */
duff(to, from, i);
printf("to = %s\n", to);
printf("from = %s\n", from);
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,32 +0,0 @@
/**
* :author: Dan Buch (daniel.buch@gmail.com)
*/
#include <stdio.h>
int get_bit_count(unsigned int x)
{
int count=0;
while(x)
{
count++;
x = x&(x-1);
}
return count;
}
int main()
{
int to_test[] = {0, 5, 7};
int current;
for (int i = 0; i < 3 ; i++) {
current = to_test[i];
printf("get_bit_count(%d) = %d\n", current, get_bit_count(current));
}
}
/* vim:filetype=c:fileencoding=utf-8
*/

@ -1,12 +0,0 @@
# puzzles from http://www.gowrikumar.com/c/
ALL_BIN := $(patsubst %.c,$(BINDIR)/%,$(wildcard *.c))
$(BINDIR)/%: %.c
$(CC) $(CFLAGS) -o $@ $<
all: $(ALL_BIN)
.PHONY: all

@ -1,48 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
const char *SOCKNAME = "/tmp/socky";
int sfd;
struct sockaddr_un addr;
int main(int argc, char *argv[])
{
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
fprintf(stderr, "FAILED TO ALLOCATE SOCKET\n");
goto error;
}
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
fprintf(stderr, "FAILED TO BIND SOCKET TO ADDRESS\n");
goto error;
}
if (listen(sfd, 128) == -1) {
fprintf(stderr, "FAILED TO LISTEN ON ADDRESS\n");
goto error;
}
for (;;) {
fprintf(stdout, "ATTEMPTING TO WAIT FOR REQUEST ON %s\n", SOCKNAME);
if (accept(sfd, NULL, NULL) == -1) {
fprintf(stderr, "FAILED TO ACCEPT REQUEST ON ADDRESS\n");
goto error;
}
}
return 0;
error:
return 1;
}

@ -1,5 +0,0 @@
*.log
koans/.path_progress
*.sqlite3
.rbenv-version
*.rbc

@ -1,28 +0,0 @@
# WRONG
# aBlock = { |x| puts x }
# RIGHT
aBlock = lambda { |x| puts x }
aBlock.call "Hello World!"
def my_lambda(&aBlock)
aBlock
end
b = my_lambda { puts "Hello World My Way!" }
b.call
aBlock = Proc.new { |x| puts x }
aBlock = proc { |x| puts x }
aBlock = lambda { |x| puts x }
add_lambda = lambda { |x,y| x + y }
# add_lambda.call(4)
# add_lambda.call(4,5,6)
puts add_lambda.call(4,2)
add_procnew = Proc.new { |x,y| x + y }
# add_procnew.call(4)
puts add_procnew.call(4,5,6)

@ -1,30 +0,0 @@
require 'pp'
def call_twice
puts "Calling your block."
ret1 = yield("very first")
puts "The value of your block: #{ret1}"
puts "Calling your block again."
ret2 = yield("second")
puts "The value of your block: #{ret2}"
end
call_twice do |which_time|
puts "I'm a code block, called for the #{which_time} time."
which_time == "very first" ? 1 : 2
end
class Hash
def find_all
new_hash = Hash.new
each { |k,v| new_hash[k] = v if yield(k, v) }
new_hash
end
end
squares = {0=>0, 1=>1, 2=>4, 3=>9}
print "squares = "
pp squares
(squares.find_all { |key, value| key > 1 }).each { |k,v| puts "#{k}: #{v}" }

@ -1,39 +0,0 @@
[1, 2, 3].each { |i| puts i }
[1, 2, 3].each do |i|
if i % 2 == 0
puts "#{i} is even."
else
puts "#{i} is odd."
end
end
1.upto 3 do |x|
puts x
end
1.upto(3) { |x| puts x }
hello = lambda { "Hello" }
hello.call
log = lambda { |str| puts "[LOG] #{str}" }
log.call("A test log message.")
{1=>2, 2=>4}.each { |k,v| puts "Key #{k}, value #{v}" }
def times_n(n)
lambda { |x| x * n }
end
times_ten = times_n(10)
puts times_ten.call(5)
puts times_ten.call(1.25)
circumference = times_n(2*Math::PI)
puts circumference.call(10)
puts circumference.call(3)
puts [1, 2, 3].collect(&circumference)
ceiling = 50
puts [1, 10, 49, 50.1, 200].select { |x| x < ceiling }

@ -1,44 +0,0 @@
require 'open-uri'
puts 'using "open-uri"'
puts open('http://oreilly.com/').read(200)
# ------------------------------------------------------------
require 'net/http'
puts 'using "net/http"'
response = Net::HTTP.get_response('oreilly.com', '/about/')
puts 'response.code=' + response.code.to_s
puts 'response.body.size=' + response.body.size.to_s
puts 'response[\'Content-type\']=' + response['Content-type']
puts 'response[0, 200]' + response.body[0, 200]
# ------------------------------------------------------------
require 'uri'
puts 'using "net/http" with a URI'
puts 'request object:' + \
Net::HTTP.get(URI.parse("http://oreilly.com")).to_s
response = Net::HTTP.get_response(URI.parse("http://oreilly.com/about/"))
# .........
puts "Success!" if response.is_a? Net::HTTPOK
puts case response.code[0]
when ?1 then "Status code indicates an HTTP informational response."
when ?2 then "Status code indicates success."
when ?3 then "Status code indicates redirection."
when ?4 then "Status code indicates client error."
when ?5 then "Status code indicates server error."
else "Non-standard status code."
end
puts 'Server=' + response['Server']
puts 'SERVER=' + response['SERVER']
puts 'all keys:'
response.each_key { |key| puts " #{key}" }
Net::HTTP.get_response('oreilly.com', '/about/') do |response|
response.read_body do |segment|
puts "Received segment of #{segment.size} byte(s)!"
end
end

@ -1,28 +0,0 @@
require 'net/http'
require 'uri'
uri = URI.parse("https://www.donotcall.gov/")
puts 'uri=' + uri.to_s
request = Net::HTTP.new(uri.host, uri.port)
# response = request.get('/')
# ^--- would have resulted in an error
require 'net/https'
puts 'making a request with use_ssl=true and verify_mode=VERIFY_NONE'
request.use_ssl = true
request.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = request.get('/')
puts 'response.body.size=' + response.body.size.to_s
request = Net::HTTP.new(uri.host, uri.port)
puts 'making a request with use_ssl=true, ' + \
'ca_path=/etc/ssl/certs and verify_mode=VERIFY_PEER'
request.use_ssl = true
request.ca_path = "/etc/ssl/certs/"
request.verify_mode = OpenSSL::SSL::VERIFY_PEER
response = request.get('/')
puts 'response.body.size=' + response.body.size.to_s

@ -1,64 +0,0 @@
require 'net/http'
require 'uri'
# A simple wrapper method that accepts either strings or URI objects
# and performs an HTTP GET.
module Net
class HTTP
def HTTP.get_with_headers(uri, headers=nil)
uri = URI.parse(uri) if uri.respond_to? :to_str
start(uri.host, uri.port) do |http|
return http.get(uri.path, headers)
end
end
end
end
# Let's get a web page in German.
res = Net::HTTP.get_with_headers('http://www.google.com/',
{'Accept-Language' => 'de'})
# Check a bit of the body to make sure it's really in German
s = res.body.size
puts 'part of body in german=' + res.body[s-3670..s-3470].to_s
Net::HTTP.get_with_headers('http://www.google.com/',
{'User-Agent' => 'Ruby Web Browser v1.0'})
uncompressed = Net::HTTP.get_with_headers('http://www.cnn.com/')
puts 'uncompressed body size=' + uncompressed.body.size.to_s
gzipped = Net::HTTP.get_with_headers('http://www.cnn.com/',
{'Accept-Encoding' => 'gzip'})
puts 'gzipped Content-Encoding=' + gzipped['Content-Encoding']
puts 'gzipped body size=' + gzipped.body.size.to_s
require 'zlib'
require 'stringio'
body_io = StringIO.new(gzipped.body)
unzipped_body = Zlib::GzipReader.new(body_io).read()
puts 'unzipped body size=' + unzipped_body.size.to_s
uri = URI.parse('http://www.google.com/')
request = Net::HTTP::Get.new(uri.path)
['en_us', 'en', 'en_gb', 'ja'].each do |language|
request.add_field('Accept-Language', language)
end
puts 'request[\'Accept-Language\']=' + request['Accept-Language'].to_s
Net::HTTP.start(uri.host, uri.port) do |http|
response = http.request(request)
puts 'response[\'Content-Type\']=' + response['Content-Type']
puts 'response headers:'
response.each_key do |key|
puts " #{key}"
end
end

@ -1,29 +0,0 @@
require 'resolv'
require 'resolv-replace'
def multiple_lookup(*names)
dns = Resolv::DNS.new
results = {}
threads = []
names.each do |name|
threads << Thread.new(name) do |name|
begin
dns.each_address(name) { |a| (results[name] ||= []) << a }
rescue Resolv::ResolvError
results[name] = nil
end
end
end
threads.each { |t| t.join }
return results
end
domains = ("a".."z").collect { |l| l + '.com' }
multiple_lookup(*domains).sort.each do |name, addresses|
if addresses
puts "#{name}: #{addresses.size} " + \
"address#{addresses.size == 1 ? "" : "es"}"
end
end

@ -1,11 +0,0 @@
require 'resolv'
dns = Resolv::DNS.new
domain = "oreilly.com"
dns.each_resource(domain, Resolv::DNS::Resource::IN::MX) do |mail_server|
puts mail_server.exchange
end
dns.each_resource(domain, Resolv::DNS::Resource::IN::NS) do |nameserver|
puts nameserver.name
end

@ -1,3 +0,0 @@
require 'resolv'
Resolv::DNS.new.each_address('oreilly.com') { |addr| puts addr }

@ -1,13 +0,0 @@
require 'rubygems'
require 'action_mailer'
class SimpleMailer < ActionMailer::Base
def headerful_message
@headers['X-custom-header'] = 'Its value'
body 'Body'
end
end
puts SimpleMailer.headerful_message

@ -1,18 +0,0 @@
require 'rubygems'
require 'net/smtp'
require 'smtp-tls'
body = <<EOM
To: daniel.buch+rubytest@gmail.com
From: daniel.buch@gmail.com
Subject: minimalist message
AHOY
EOM
Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com',
'daniel.buch@gmail.com', STDIN.readline, :login) do |smtp|
smtp.send_message(body, 'daniel.buch@gmail.com',
'daniel.buch+rubytest@gmail.com')
end

@ -1,31 +0,0 @@
require 'rubygems'
require 'action_mailer'
require 'mime/types'
class SimpleMailer < ActionMailer::Base
def directory_dump_message(recipient, directory)
from 'directory-dump@localhost'
recipients recipient
subject "Dump of #{directory}"
body %{Here are the files currently in "#{directory}":}
Dir.new(directory).each do |f|
path = File.join(directory, f)
if File.file? path
mime_type = MIME::Types.of(f).first
content_type = (mime_type ? mime_type.content_type :
'application/octet-stream')
attachments[f] = {
:mime_type => mime_type,
:encoding => ('quoted-printable' if content_type =~ /^text\//),
:content => File.read(path)
}
end
end
end
end
puts SimpleMailer.directory_dump_message('daniel.buch+rubytest@gmail.com',
'/tmp')

@ -1,28 +0,0 @@
require 'rubygems'
require 'action_mailer'
class SimpleMailer < ActionMailer::Base
def simple_message(recipient)
from 'daniel.buch@gmail.com'
recipients recipient
subject 'A single-part message for you'
body 'This message has a plain text body.'
end
end
puts 'generated message:'
puts SimpleMailer.simple_message('daniel.buch+rubytest@gmail.com')
ActionMailer::Base.smtp_settings = {
:tls => true,
:address => 'smtp.gmail.com',
:port => "587",
:domain => 'gmail.com',
:user_name => 'daniel.buch@gmail.com',
:password => STDIN.readline
}
SimpleMailer.simple_message('daniel.buch+rubytest@gmail.com').deliver

@ -1,4 +0,0 @@
.bundle
db/*.sqlite3
log/*.log
tmp/

@ -1,31 +0,0 @@
source 'http://rubygems.org'
gem 'rails', '3.0.9'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'sqlite3'
# Use unicorn as the web server
# gem 'unicorn'
# Deploy with Capistrano
# gem 'capistrano'
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19', :require => 'ruby-debug'
# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
# gem 'sqlite3-ruby', :require => 'sqlite3'
# gem 'aws-s3', :require => 'aws/s3'
# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
# group :development, :test do
# gem 'webrat'
# end

@ -1,76 +0,0 @@
GEM
remote: http://rubygems.org/
specs:
abstract (1.0.0)
actionmailer (3.0.9)
actionpack (= 3.0.9)
mail (~> 2.2.19)
actionpack (3.0.9)
activemodel (= 3.0.9)
activesupport (= 3.0.9)
builder (~> 2.1.2)
erubis (~> 2.6.6)
i18n (~> 0.5.0)
rack (~> 1.2.1)
rack-mount (~> 0.6.14)
rack-test (~> 0.5.7)
tzinfo (~> 0.3.23)
activemodel (3.0.9)
activesupport (= 3.0.9)
builder (~> 2.1.2)
i18n (~> 0.5.0)
activerecord (3.0.9)
activemodel (= 3.0.9)
activesupport (= 3.0.9)
arel (~> 2.0.10)
tzinfo (~> 0.3.23)
activeresource (3.0.9)
activemodel (= 3.0.9)
activesupport (= 3.0.9)
activesupport (3.0.9)
arel (2.0.10)
builder (2.1.2)
erubis (2.6.6)
abstract (>= 1.0.0)
i18n (0.5.0)
mail (2.2.19)
activesupport (>= 2.3.6)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16)
polyglot (0.3.2)
rack (1.2.3)
rack-mount (0.6.14)
rack (>= 1.0.0)
rack-test (0.5.7)
rack (>= 1.0)
rails (3.0.9)
actionmailer (= 3.0.9)
actionpack (= 3.0.9)
activerecord (= 3.0.9)
activeresource (= 3.0.9)
activesupport (= 3.0.9)
bundler (~> 1.0)
railties (= 3.0.9)
railties (3.0.9)
actionpack (= 3.0.9)
activesupport (= 3.0.9)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (~> 0.14.4)
rake (0.9.2)
rdoc (3.9.1)
sqlite3 (1.3.4)
thor (0.14.6)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.29)
PLATFORMS
ruby
DEPENDENCIES
rails (= 3.0.9)
sqlite3

@ -1,256 +0,0 @@
== Welcome to Rails
Rails is a web-application framework that includes everything needed to create
database-backed web applications according to the Model-View-Control pattern.
This pattern splits the view (also called the presentation) into "dumb"
templates that are primarily responsible for inserting pre-built data in between
HTML tags. The model contains the "smart" domain objects (such as Account,
Product, Person, Post) that holds all the business logic and knows how to
persist themselves to a database. The controller handles the incoming requests
(such as Save New Account, Update Product, Show Post) by manipulating the model
and directing data to the view.
In Rails, the model is handled by what's called an object-relational mapping
layer entitled Active Record. This layer allows you to present the data from
database rows as objects and embellish these data objects with business logic
methods. You can read more about Active Record in
link:files/vendor/rails/activerecord/README.html.
The controller and view are handled by the Action Pack, which handles both
layers by its two parts: Action View and Action Controller. These two layers
are bundled in a single package due to their heavy interdependence. This is
unlike the relationship between the Active Record and Action Pack that is much
more separate. Each of these packages can be used independently outside of
Rails. You can read more about Action Pack in
link:files/vendor/rails/actionpack/README.html.
== Getting Started
1. At the command prompt, create a new Rails application:
<tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
2. Change directory to <tt>myapp</tt> and start the web server:
<tt>cd myapp; rails server</tt> (run with --help for options)
3. Go to http://localhost:3000/ and you'll see:
"Welcome aboard: You're riding Ruby on Rails!"
4. Follow the guidelines to start developing your application. You can find
the following resources handy:
* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
* Ruby on Rails Tutorial Book: http://www.railstutorial.org/
== Debugging Rails
Sometimes your application goes wrong. Fortunately there are a lot of tools that
will help you debug it and get it back on the rails.
First area to check is the application log files. Have "tail -f" commands
running on the server.log and development.log. Rails will automatically display
debugging and runtime information to these files. Debugging info will also be
shown in the browser on requests from 127.0.0.1.
You can also log your own messages directly into the log file from your code
using the Ruby logger class from inside your controllers. Example:
class WeblogController < ActionController::Base
def destroy
@weblog = Weblog.find(params[:id])
@weblog.destroy
logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
end
end
The result will be a message in your log file along the lines of:
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
More information on how to use the logger is at http://www.ruby-doc.org/core/
Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
several books available online as well:
* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
These two books will bring you up to speed on the Ruby language and also on
programming in general.
== Debugger
Debugger support is available through the debugger command when you start your
Mongrel or WEBrick server with --debugger. This means that you can break out of
execution at any point in the code, investigate and change the model, and then,
resume execution! You need to install ruby-debug to run the server in debugging
mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
class WeblogController < ActionController::Base
def index
@posts = Post.find(:all)
debugger
end
end
So the controller will accept the action, run the first line, then present you
with a IRB prompt in the server window. Here you can do things like:
>> @posts.inspect
=> "[#<Post:0x14a6be8
@attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
#<Post:0x14a6620
@attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
>> @posts.first.title = "hello from a debugger"
=> "hello from a debugger"
...and even better, you can examine how your runtime objects actually work:
>> f = @posts.first
=> #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
>> f.
Display all 152 possibilities? (y or n)
Finally, when you're ready to resume execution, you can enter "cont".
== Console
The console is a Ruby shell, which allows you to interact with your
application's domain model. Here you'll have all parts of the application
configured, just like it is when the application is running. You can inspect
domain models, change values, and save to the database. Starting the script
without arguments will launch it in the development environment.
To start the console, run <tt>rails console</tt> from the application
directory.
Options:
* Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
made to the database.
* Passing an environment name as an argument will load the corresponding
environment. Example: <tt>rails console production</tt>.
To reload your controllers and models after launching the console run
<tt>reload!</tt>
More information about irb can be found at:
link:http://www.rubycentral.com/pickaxe/irb.html
== dbconsole
You can go to the command line of your database directly through <tt>rails
dbconsole</tt>. You would be connected to the database with the credentials
defined in database.yml. Starting the script without arguments will connect you
to the development database. Passing an argument will connect you to a different
database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
PostgreSQL and SQLite 3.
== Description of Contents
The default directory structure of a generated Ruby on Rails application:
|-- app
| |-- controllers
| |-- helpers
| |-- mailers
| |-- models
| `-- views
| `-- layouts
|-- config
| |-- environments
| |-- initializers
| `-- locales
|-- db
|-- doc
|-- lib
| `-- tasks
|-- log
|-- public
| |-- images
| |-- javascripts
| `-- stylesheets
|-- script
|-- test
| |-- fixtures
| |-- functional
| |-- integration
| |-- performance
| `-- unit
|-- tmp
| |-- cache
| |-- pids
| |-- sessions
| `-- sockets
`-- vendor
`-- plugins
app
Holds all the code that's specific to this particular application.
app/controllers
Holds controllers that should be named like weblogs_controller.rb for
automated URL mapping. All controllers should descend from
ApplicationController which itself descends from ActionController::Base.
app/models
Holds models that should be named like post.rb. Models descend from
ActiveRecord::Base by default.
app/views
Holds the template files for the view that should be named like
weblogs/index.html.erb for the WeblogsController#index action. All views use
eRuby syntax by default.
app/views/layouts
Holds the template files for layouts to be used with views. This models the
common header/footer method of wrapping views. In your views, define a layout
using the <tt>layout :default</tt> and create a file named default.html.erb.
Inside default.html.erb, call <% yield %> to render the view using this
layout.
app/helpers
Holds view helpers that should be named like weblogs_helper.rb. These are
generated for you automatically when using generators for controllers.
Helpers can be used to wrap functionality for your views into methods.
config
Configuration files for the Rails environment, the routing map, the database,
and other dependencies.
db
Contains the database schema in schema.rb. db/migrate contains all the
sequence of Migrations for your schema.
doc
This directory is where your application documentation will be stored when
generated using <tt>rake doc:app</tt>
lib
Application specific libraries. Basically, any kind of custom code that
doesn't belong under controllers, models, or helpers. This directory is in
the load path.
public
The directory available for the web server. Contains subdirectories for
images, stylesheets, and javascripts. Also contains the dispatchers and the
default HTML files. This should be set as the DOCUMENT_ROOT of your web
server.
script
Helper scripts for automation and generation.
test
Unit and functional tests along with fixtures. When using the rails generate
command, template test files will be generated for you and placed in this
directory.
vendor
External libraries that the application depends on. Also includes the plugins
subdirectory. If the app has frozen rails, those gems also go here, under
vendor/rails/. This directory is in the load path.

@ -1,7 +0,0 @@
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
require 'rake'
Hodgepodge::Application.load_tasks

@ -1,28 +0,0 @@
class ApplicationController < ActionController::Base
before_filter :set_user, :count_visits
protect_from_forgery
private
def count_visits
value = (cookies[:visits] || '0').to_i
cookies[:visits] = (value + 1).to_s
@visits = cookies[:visits]
end
protected
def set_user
@user = User.find(session[:id]) if @user.nil? && session[:id]
end
def login_required
return true if @user
access_denied
return false
end
def access_denied
session[:return_to] = request.fullpath
flash[:error] = 'Oops. You need to login before you can view that page.'
redirect_to :controller => 'user', :action => 'login'
end
end

@ -1,18 +0,0 @@
class FooController < ApplicationController
layout :figure_out_layout
def index
end
def pretty
end
def figure_out_layout
if action_name =~ /pretty/
'pretty'
else
'standard'
end
end
end

@ -1,5 +0,0 @@
class HelloController < ApplicationController
def world
end
end

@ -1,6 +0,0 @@
class IndexController < ApplicationController
def index
session[:first_time] ||= Time.now
end
end

@ -1,20 +0,0 @@
require 'sha1'
class ListController < ApplicationController
def index
@list = [1, "string", :symbol, ['list']]
end
def shopping_list
@list = [ListItem.new(4, 'aspirin'), ListItem.new(199, 'succotash')]
end
end
class ListItem
attr_accessor :name, :id
def initialize(id, name)
@id, @name = id, name
end
end

@ -1,25 +0,0 @@
$one = 1
class NovelController < ApplicationController
$two = 2
def index
@title = 'Shattered View: a Novel on Rails'
one_plus_one = 1 + 1
increment_counter one_plus_one
end
def helper_method
@help_message = "I see you've come to me for help."
end
def increment_counter(by)
@counter ||= 0
@counter += by
end
def sequel
$three = 3
end
end

@ -1,5 +0,0 @@
class PeopleController < ApplicationController
def list
end
end

@ -1,8 +0,0 @@
class StatusController < ApplicationController
def index
@title = "System Status"
time = Time.now
@time = time
@ps = `ps aux`
end
end

@ -1,28 +0,0 @@
class UserController < ApplicationController
before_filter :login_required, :only => :my_account
def login
@user = User.new
@user.username = params[:username]
end
def process_login
if user = User.authenticate(params[:user])
session[:id] = user.id
redirect_to session[:return_to] || '/'
else
flash[:error] = 'Invalid login.'
redirect_to :action => 'login', :username => params[:user][:username]
end
end
def logout
reset_session
flash[:message] = 'Logged out.'
redirect_to :action => 'login'
end
def my_account
end
end

@ -1,9 +0,0 @@
require 'sha1'
module ListHelper
def create_li(item, i)
%{<li class="#{ i % 2 == 0 ? 'even' : 'odd' }">#{i}:
#{SHA1.new(item.object_id.to_s)}</li>}
end
end

@ -1,2 +0,0 @@
class Person < ActiveRecord::Base
end

@ -1,32 +0,0 @@
require 'sha1'
class User < ActiveRecord::Base
attr_accessor :password
attr_protected :hashed_password
validates_uniqueness_of :username
validates_confirmation_of :password, :if => lambda { |user|
user.new_record? or not user.password.blank? }
validates_length_of :password, :within => 5..40, :if => lambda { |user|
user.new_record? or not user.password.blank? }
def self.hashed(str)
SHA1.new(str).to_s
end
def self.authenticate(user_info)
user = find_by_username(user_info[:username])
if user && user.hashed_password == hashed(user_info[:password])
return user
end
end
private
before_save :update_password
def update_password
if not password.blank?
self.hashed_password = self.class.hashed(password)
end
end
end

@ -1,2 +0,0 @@
<h1>Foo#count</h1>
<p>Find me in app/views/foo/count.html.erb</p>

@ -1,2 +0,0 @@
<h1>Foo#index</h1>
<p>Find me in app/views/foo/index.html.erb</p>

@ -1,2 +0,0 @@
<h1>Foo#pretty</h1>
<p>Find me in app/views/foo/pretty.html.erb</p>

@ -1,11 +0,0 @@
<h1>Several increasingly silly ways of displaying &ldquo;Hello world!&rdquo;:</h1>
<p><%= "Hello world!" %></p>
<p><%= "Hello" + " world!" %></p>
<p><%= w = "world"
"Hello #{w}!" %></p>
<p><%= 'H' + ?e.chr + ('l' * 2) %><%= ('o word!').gsub('d', 'ld')%></p>
<% hello = "Hello" %>
<% world = "world!" %>
<%= hello %> <%= world %>

@ -1,4 +0,0 @@
<p>You first visited this site on <%= session[:first_time] %>.</p>
<p>That was <%= time_ago_in_words session[:first_time] %> ago.</p>
<p>You have visited this website&#39;s pages <%= @visits %> time(s).</p>

@ -1,9 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>My Website - <%= @title %></title>
</head>
<body>
<%= yield %>
</body>
</html>

@ -1,9 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>BAR :: My Website - <%= @title %></title>
</head>
<body>
<%= yield %>
</body>
</html>

@ -1,9 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>COUNT :: My Website - <%= @title %></title>
</head>
<body>
<%= yield %>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save