elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 20
11  Programación / Java / Re: [Java] Utilizar un ArrayList en un JFrame en: 3 Diciembre 2017, 05:10 am
Como te dijo ivancea96,
Cuando se haga click que se guarde las coordenadas en un ArrayList, por cada elemento del arrayList se guardara un array de int, el cual contendra como primero valor la X y luego la Y, o bien puedes optar por crear una clase, Coordenada y obtenerlo desde una instancia.

Luego en el método paint, recorreras todo el arrayList con las coordenadas que se fue registrando.

Prueba este código:

Código
  1. package Graficos;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.GraphicsEnvironment;
  7. import java.awt.event.MouseAdapter;
  8. import java.awt.event.MouseEvent;
  9. import java.awt.event.MouseListener;
  10. import java.awt.geom.Ellipse2D;
  11. import java.util.ArrayList;
  12. import java.util.Random;
  13. import javax.swing.JFrame;
  14. import javax.swing.JPanel;
  15.  
  16. public class Graficos2D {
  17.  
  18. public static void main(String[] args) {
  19.  
  20. Marco NewMarco = new Marco();
  21. NewMarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  22. }
  23. }
  24. class Marco extends JFrame {
  25.  
  26.    ArrayList<Integer[]> coordenadas;
  27.  
  28. int x;
  29.        int y;
  30.        int radio;
  31.  
  32. public Marco() {
  33.            this.coordenadas = new ArrayList<Integer[]>();
  34. setVisible(true);
  35. setSize(500,500);
  36. x = getSize().width/2;
  37.                y = getSize().height/2;
  38. setTitle("Dibujando Circulos");
  39.        addMouseListener(new MouseAdapter(){
  40.            @Override
  41.            public void mouseClicked(MouseEvent e) {
  42.                super.mouseMoved(e);
  43.                coordenadas.add(new Integer[]{x=e.getX(), y=e.getY()});
  44.                repaint();
  45.            }
  46.        });
  47. }
  48. @Override
  49. public void paint(Graphics g) {
  50. super.paint(g);
  51.                radio = 25;
  52. Random r = new Random();
  53. g2.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
  54.                for(int i = 0; i < coordenadas.size(); i++) {
  55.                    Ellipse2D circulo=new Ellipse2D.Float(coordenadas.get(i)[0]-radio, coordenadas.get(i)[1]-radio, radio*2, radio*2);
  56.                    g2.fill(circulo);
  57.                }
  58. }
  59.        class EventoMouse {
  60.            public EventoMouse(){
  61.            }
  62.        }
  63. }
  64.  

Si quieres que los colores de cada circulo quede como era originalmente, deberás crear una clase que guarde dichos valores para luego ser pintado con el color que le corresponde a cada circulo, eso ya te lo dejo para ti.

Muchas gracias por comunicarse con foro el hacker que tenga buen día señor.
12  Programación / Java / Re: [AYUDA]Convertir un array de enteros a un numero entero en Java en: 7 Noviembre 2017, 02:18 am
Yo lo haria de la siguiente forma.

Código
  1. int[] cadena = {1,2,3,4};
  2.        String unionString = "";
  3.        int union = 0;
  4.  
  5.        for(int i = 0; i < cadena.length; i++) {
  6.            unionString += cadena[i];
  7.        }
  8.  
  9.        union = Integer.parseInt(unionString);
  10.        System.out.println(union);
  11.  

Si no entiendes algo avisa.
Saludos.
13  Programación / Java / [Ayuda]ListView no responde no detecta pulsaciones en: 10 Marzo 2017, 23:38 pm
Hola a todos tengo un problema con mi app, resulta que tengo 1 DrawerLayout con 1 listView lateral, que tiene 3 opciones, cada una al hacerle un click me carga un Fragment diferente en la pantalla central de mi Activity ocupando todo el espacio disponible.

El problema es que cuando cargo un fragment por primera vez, sea cual sea(Pulsando en el listView lateral), lo hace perfecto, pero luego al intentar cargar otro Fragment por segunda vez no puedo hacerlo, ya que el listView al darle click a otra opción este se vuelve a ocultar, y no puedo hacer el click para mostrar mi otro Fragment  :-\

Este es mi código del MainActivity:

Código
  1. package com.funcioneslineales2.funcioneslineales2;
  2.  
  3. import android.app.FragmentManager;
  4. import android.support.v4.app.FragmentActivity;
  5. import android.support.v4.app.FragmentTransaction;
  6. import android.support.v4.view.GravityCompat;
  7. import android.support.v4.widget.DrawerLayout;
  8. import android.support.v7.app.AlertDialog;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.widget.AdapterView;
  13. import android.widget.ArrayAdapter;
  14. import android.widget.ListView;
  15. import android.widget.Toast;
  16.  
  17. public class MainActivity extends AppCompatActivity {
  18.  
  19.    ListView listView;
  20.  
  21.    @Override
  22.    protected void onCreate(Bundle savedInstanceState) {
  23.        super.onCreate(savedInstanceState);
  24.        setContentView(R.layout.activity_main);
  25.  
  26.  
  27.        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.asd);
  28.        drawer.closeDrawer(GravityCompat.START);
  29.        String[] opciones = {"Pendiente y ordenada", "Ecuación punto pendiente", "Pasa por (x1,y1) y (x2,y2)"};
  30.  
  31.        listView = (ListView) findViewById(R.id.listView);
  32.        ArrayAdapter<String> adapterListView = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, opciones);
  33.        listView.setAdapter(adapterListView);
  34.        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  35.            @Override
  36.            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  37.                if(position == 0) {
  38.                    setFragment(0);
  39.                }
  40.                if(position == 1) {
  41.                    setFragment(1);
  42.                }
  43.                if(position == 2) {
  44.                    setFragment(1);
  45.                }
  46.            }
  47.        });
  48.  
  49.    }
  50.  
  51.    public void setFragment(int position) {
  52.        android.support.v4.app.FragmentManager fragmentManager;
  53.        FragmentTransaction fragmentTransaction;
  54.        switch (position) {
  55.            case 0:
  56.                fragmentManager = getSupportFragmentManager();
  57.                fragmentTransaction = fragmentManager.beginTransaction();
  58.                FuncionLinealPendienteOrdenada funcionLinealPendienteOrdenada = new FuncionLinealPendienteOrdenada();
  59.                fragmentTransaction.replace(R.id.asd, funcionLinealPendienteOrdenada);
  60.                fragmentTransaction.commit();
  61.                break;
  62.            case 1:
  63.                fragmentManager = getSupportFragmentManager();
  64.                fragmentTransaction = fragmentManager.beginTransaction();
  65.                FuncionLinealPendiente1Punto funcionLinealPendiente1Punto = new FuncionLinealPendiente1Punto();
  66.                fragmentTransaction.replace(R.id.asd, funcionLinealPendiente1Punto);
  67.                fragmentTransaction.commit();
  68.                break;
  69.        }
  70.    }
  71. }
  72.  
  73.  

Y este es el Layout del MainActivity:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:tools="http://schemas.android.com/tools"
  4.    android:layout_width="match_parent"
  5.    android:layout_height="match_parent"
  6.    tools:context="com.funcioneslineales2.funcioneslineales2.MainActivity"
  7.    android:id="@+id/asd">
  8.  
  9.    <include
  10.        android:layout_width="wrap_content"
  11.        android:layout_height="wrap_content"
  12.        layout="@layout/drawer_layout"
  13.        android:layout_gravity="start"/>
  14. </android.support.v4.widget.DrawerLayout>
  15.  
  16.  

Layout cabezera:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical" android:layout_width="match_parent"
  4.    android:layout_height="wrap_content"
  5.    android:background="#92ea17">
  6.  
  7.    <ImageView
  8.        android:layout_width="wrap_content"
  9.        android:layout_height="wrap_content"
  10.        android:id="@+id/imageView"
  11.        android:layout_alignParentTop="true"
  12.        android:layout_alignParentLeft="true"
  13.        android:layout_alignParentStart="true"
  14.        android:src="@android:drawable/sym_def_app_icon"
  15.        android:padding="20dp"/>
  16.  
  17.    <TextView
  18.        android:layout_width="wrap_content"
  19.        android:layout_height="wrap_content"
  20.        android:textAppearance="?android:attr/textAppearanceLarge"
  21.        android:text="Funciones lineales"
  22.        android:id="@+id/textView"
  23.        android:layout_centerVertical="true"
  24.        android:layout_toRightOf="@+id/imageView"
  25.        android:layout_toEndOf="@+id/imageView"
  26.        android:textStyle="bold"
  27.        android:layout_marginLeft="10dp" />
  28. </RelativeLayout>
  29.  

Layout del ListView:

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical" android:layout_width="match_parent"
  4.    android:layout_height="match_parent">
  5.  
  6.    <ListView
  7.        android:layout_width="wrap_content"
  8.        android:layout_height="match_parent"
  9.        android:id="@+id/listView"
  10.        android:layout_alignParentTop="true"
  11.        android:layout_alignParentLeft="true"
  12.        android:layout_alignParentStart="true" />
  13. </RelativeLayout>
  14.  

Y el layout DrawerLayout(Donde uno la cabezera y el listview):

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    android:orientation="vertical" android:layout_width="match_parent"
  4.    android:layout_height="match_parent"
  5.    android:background="#cfc4c4">
  6.  
  7.    <include
  8.        android:layout_width="match_parent"
  9.        android:layout_height="wrap_content"
  10.        layout="@layout/cabezera"
  11.        android:layout_alignParentTop="true"
  12.        android:layout_alignParentLeft="true"
  13.        android:layout_alignParentStart="true"
  14.        android:id="@+id/include" />
  15.  
  16.    <include
  17.        android:layout_width="wrap_content"
  18.        android:layout_height="wrap_content"
  19.        layout="@layout/lista_drawer"
  20.        android:layout_below="@+id/include"
  21.        android:layout_alignParentLeft="true"
  22.        android:layout_alignParentStart="true" />
  23. </RelativeLayout>
  24.  

Y las clases de los fragments:

Código
  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.support.v7.app.AlertDialog;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9.  
  10. import java.util.zip.Inflater;
  11.  
  12.  
  13. /**
  14.  * A simple {@link Fragment} subclass.
  15.  */
  16. public class FuncionLinealPendienteOrdenada extends Fragment {
  17.  
  18.  
  19.    EditText etPendiente, etOrdenadaAlOrigen;
  20.    Button btnCalcular;
  21.    public FuncionLinealPendienteOrdenada() {
  22.        // Required empty public constructor
  23.    }
  24.  
  25.  
  26.    @Override
  27.    public View onCreateView(LayoutInflater inflater, ViewGroup container,
  28.                             Bundle savedInstanceState) {
  29.        // Inflate the layout for this fragment
  30.  
  31.        View view = inflater.inflate(R.layout.fragment_funcion_lineal_pendiente_ordenada, container, false);
  32.        etPendiente = (EditText)view.findViewById(R.id.editText);
  33.        etOrdenadaAlOrigen = (EditText)view.findViewById(R.id.editText2);
  34.        btnCalcular = (Button)view.findViewById(R.id.button);
  35.        btnCalcular.setOnClickListener(new View.OnClickListener() {
  36.            @Override
  37.            public void onClick(View view) {
  38.                calcularPuntos();
  39.            }
  40.        });
  41.  
  42.        return view;
  43.    }
  44.  
  45.    public void calcularPuntos() {
  46.        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
  47.        builder.setTitle("Resultado");
  48.        builder.setMessage(new FuncionLineal().calcularPuntos2(Double.parseDouble(etPendiente.getText().toString()), Double.parseDouble(etOrdenadaAlOrigen.getText().toString())));
  49.        builder.setPositiveButton("OK",null);
  50.        builder.create();
  51.        builder.show();
  52.    }
  53.  
  54. }
  55.  
  56.  


Código
  1. import android.os.Bundle;
  2. import android.support.v4.app.Fragment;
  3. import android.support.v7.app.AlertDialog;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9.  
  10.  
  11. /**
  12.  * A simple {@link Fragment} subclass.
  13.  */
  14. public class FuncionLinealPendiente1Punto extends Fragment {
  15.  
  16.    EditText etPendiente, x1, y1;
  17.    Button btnCalcular;
  18.    public FuncionLinealPendiente1Punto() {
  19.        // Required empty public constructor
  20.    }
  21.  
  22.  
  23.    @Override
  24.    public View onCreateView(LayoutInflater inflater, ViewGroup container,
  25.                             Bundle savedInstanceState) {
  26.        // Inflate the layout for this fragment
  27.        View view = inflater.inflate(R.layout.fragment_funcion_lineal_pendiente1_punto, container, false);
  28.        etPendiente = (EditText)view.findViewById(R.id.editText3);
  29.        x1 = (EditText)view.findViewById(R.id.editText4);
  30.        y1 = (EditText)view.findViewById(R.id.editText5);
  31.        btnCalcular = (Button)view.findViewById(R.id.button2);
  32.        btnCalcular.setOnClickListener(new View.OnClickListener() {
  33.            @Override
  34.            public void onClick(View view) {
  35.                calcularPuntos();
  36.            }
  37.        });
  38.  
  39.        return view;
  40.    }
  41.  
  42.    public void calcularPuntos() {
  43.        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
  44.        builder.setTitle("Resultado");
  45.        builder.setMessage(new FuncionLineal().calcularPuntosSinOrdenada(Double.parseDouble(etPendiente.getText().toString()), Double.parseDouble(x1.getText().toString()), Double.parseDouble(y1.getText().toString())));
  46.        builder.setPositiveButton("OK",null);
  47.        builder.create();
  48.        builder.show();
  49.    }
  50.  
  51. }
  52.  
  53.  

Gracias de antemano.
14  Programación / Java / Re: Necesito ayuda con un problema que se que debe de ser tonto en: 25 Enero 2017, 06:11 am
Si la clase Operaciones va a heredar de Lectura no es necesario crear una instancia de la clase Lectura, es por eso que te pide 2 veces el radio.

Prueba el método main asi:

Código
  1. public static void main(String[] args) {
  2.            Operaciones o = new Operaciones();
  3.  
  4.            System.out.println("El area de la circunferencia con radio " + o.getRadio() + " es: " + o.getArea());
  5.            System.out.println("La longitud de la cirfunferencia con radio " + o.getRadio() + " es: " + o.getLongitud());
  6. }
  7.  

Saludos.
15  Programación / Desarrollo Web / Re: ¿Como pasar parámetros de "JS" al "action" de la etiqueta form? en: 24 Enero 2017, 05:11 am
Muichas gracias!  logre solucionar mi problema, no sabia que existía esa etiqueta, me has salvado xD :P
Saludos!
16  Programación / Desarrollo Web / Re: ¿Como pasar parámetros de "JS" al "action" de la etiqueta form? en: 24 Enero 2017, 04:34 am
Estoy creando una web(fines educativos) en la cual cualquiera puede crear temas anonimamente(sin registrarse), ya hice la parte en donde se guardan los temas creados en una base de datos, ahora estoy haciendo que esos temas creados se puedan editar.

Cuando la persona esta viendo un tema creado, tiene la opción de editar dicho tema, la cual lo manda a la pagina de edicion donde hay un formulario, que es el siguiente:

editarPostFormulario.php
Código
  1. <!DOCTYPE html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Bugatty Veyron</title>
  5. <link href="style.css" rel="stylesheet" type="text/css">
  6.  
  7. </head>
  8. <body>
  9. <script type="text/javascript">
  10.  
  11. function editarPost() {
  12. tituloPost = "<?php echo $_GET['titulo']; ?>";
  13.  
  14. palabras = tituloPost.split(" ");
  15. cadenaLista = "";
  16. for (var i = 0; i < palabras.length; i++) {
  17. cadenaLista += palabras[i]+"%20";
  18. }
  19. pagina = "editarPost.php?titulo="+cadenaLista;
  20. return pagina;
  21. }
  22.  
  23. </script>
  24. <div id="cabezera">
  25. <h1>PÁGINA BUGATTY VEYRON</h1>
  26. <ul>
  27. <li><a href="index.php" id="liInicio">Inicio</a></li>
  28. <li><a href="Calculadora.html" id="liCalculadora">Calculadora</a></li>
  29. <li><a href="CrearTemaFormulario.php" id="liCrearTema">Crear tema</a></li>
  30. </ul>
  31. </div>
  32. <div id="formularioCrearTema">
  33. <form method="POST" action="<?php $_GET['titulo'] ?>">
  34. <tr>
  35. <td>Nombre: <input id="nombre" type="text" size="85" name="nombre" style="background: transparent; border: 2px solid black; border-radius: 10px; padding: 5px;"></td>
  36. <td></td>
  37. </tr>
  38. <tr>
  39. <td>Titulo del tema: <input id="titulo" type="text" size="85" name="titulo" style="background: transparent; border: 3px solid black; border-radius: 10px; padding: 5px;"></td>
  40. <td></td>
  41. </tr>
  42. <tr>
  43. <td><textarea rows="15" cols="100" id="textArea" name="textArea" style="background: transparent; border: 3px solid black; border-radius: 10px; padding: 5px;"></textarea></td>
  44. </tr>
  45. <tr>
  46. <td><input type="submit" value="Editar tema"></td>
  47. </tr>
  48. </table>
  49. </form>
  50. <script type="text/javascript">
  51. var nombre = "<?php include('code.php'); $post = new Post($_GET['titulo']); echo $post->nombre; ?>";
  52. var titulo = "<?php echo $_GET['titulo']; ?>";
  53. var cuerpo = "<?php echo $post->cuerpo; ?>";
  54.  
  55. var nombreForm = document.getElementById('nombre');
  56. nombreForm.value = nombre;
  57.  
  58. var tituloForm = document.getElementById('titulo');
  59. tituloForm.value = titulo;
  60.  
  61. var cuerpoForm = document.getElementById('textArea');
  62. cuerpoForm.innerHTML = cuerpo;
  63. </script>
  64. </div>
  65. </body>
  66. </html>
  67.  

Y cuando la persona le da en el botón, de editarTema, necesito mandar el titulo original, es decir el antiguo, no el editado para localizarlo en la base de datos y luego editarlo en la web que sigue, y los tengo que pasar por el método GET, por que por el POST no puedo, osea por URL.
Lo que escriba la persona lo mando atravez del método POST del formulario, que es lo que voy a obtener en la siguiente web que me redirija el parámetro action del formulario.

[size=16t]Ahora lo que quiero lograr es que en el la siguiente pagina pueda obtener el titulo original(NO EL EDITADO), para ubicar el tema en la base de datos y editarlo como corresponde.

Como puedo hacer eso? Otra forma que se me ocurría es guardarlo en una etiqueta label al titulo y obtenerlo desde POST en la siguiente pagina, pero el diseño no quedaría como quiero[/size]
17  Programación / Desarrollo Web / ¿Como pasar parámetros de "JS" al "action" de la etiqueta form? en: 24 Enero 2017, 03:53 am
Hola a todos, ¿como puedo pasar parametros de una funcion javascript al parametro "action" la etiqueta form de la siguiente linea de código?:

Código
  1. <form method="POST" action="javascript:editarPost();">
  2.  
  3. </form>
  4.  

Ya intente de estas formas:
Código
  1. <form method="POST" action="javascript:editarPost();">
  2.  
  3. </form>
  4.  

Código
  1. <form method="POST" action="editarPost();">
  2.  
  3. </form>
  4.  

Código
  1. <form method="POST" action="editarPost()">
  2.  
  3. </form>
  4.  

Pero ninguna me sirve, el codigo javascript es el siguiente, el cual funciona perfectamente, ya lo he probado:

Código
  1. <script type="text/javascript">
  2.  
  3. function editarPost() {
  4. tituloPost = "<?php echo $_GET['titulo']; ?>";
  5.  
  6. palabras = tituloPost.split(" ");
  7. cadenaLista = "";
  8. for (var i = 0; i < palabras.length; i++) {
  9. cadenaLista += palabras[i]+"%20";
  10. }
  11. pagina = "editarPost.php?titulo="+cadenaLista;
  12. return pagina;
  13. }
  14.  
  15. </script>
  16.  
Este código js esta al principio de las etiquetas body.

Esto me funciona perfecto con el onClick, pero con el action no me sirve, y si o si lo necesito con ese parámetro, con el onClick no me sirve, alguna sugerencia?
18  Programación / Java / Re: ¿En qué estoy fallando en herencia java? auxilio por favor en: 16 Diciembre 2016, 02:00 am
Citar
¿Entonces no puedo modificar las variables de la superClase y dejar esos cambios presentes para las otras clases? Esto lo necesito para mantener las variables de sesión de mi aplicación cargadas en memoria... darme un indicio que como podria lograrlo?
Todas las variables que crees en las clases, son de objeto, eso quiere decir que al hacer un cambio en esa variable, se vera reflejada en el objeto y solo en ese objeto, si quieres que se haga que el cambio afecte a todos los objetos puedes declarar esa variable como estática, de esta manera al hacer un cambio se vera reflejado en todos los objetos que instancies de esa clase.

Así se veria una variable estática:
Código
  1. static int numero = 10;


Citar
Haciendolo de esta manera me mantinene el 37 en la clase principal

MI pregunta es: ¿esto es correcto o es un barbarismo?
Es correcto, ya que cuando pasas un objeto por parámetro, java lo pasa por referencia, es decir que esa variable apuntara también al objeto original, de modo que ambas variables apuntarían al mismo objeto en memoria, y si modificas uno, en realidad no modificas el otro, si no que afectara a ambos por que apuntan a lo mismo objeto.

Espero me entiendas, si no coméntame tu duda.

Saludos.
19  Programación / Java / Re: Error al pasar un array al método contructor de un objeto en: 23 Octubre 2016, 02:35 am
Hola, intenta quitando el void del metodo:
Código
  1. public "void" Math2(float[] lista){
  2.        this.lista=lista;
  3.        this.longitud=lista.length;
  4.    }

Así:
Código
  1. public Math2(float[] lista){
  2.        this.lista=lista;
  3.        this.longitud=lista.length;
  4.    }

De esta forma te reconocerá el constructor cuando instancies un objeto de esta clase.

Saludos!
20  Programación / Java / Re: Como hacer que mi programa aparezca en la lista de programas de Windows en: 20 Octubre 2016, 05:02 am
Gracias! le echare un ojo y luego cuento como me fue.

Saludos!
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 20
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines