Merteknik

Diskussion om teknik och vetenskap

Arkiv för kategorin Programmering

Att fram veckonummer kan vara klurig när man inser att det inte finns något stöd för veckor i datatypen DateTime.

Istället för att implementera en egen funktion som räknar ut veckans nummer (1-53) så går det att använda CultureInfo’s Calendar som återfinns i System. Globalization.

public static int getWeekOfYear(DateTime date) {

        int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        return week;
}

Funktionens parametrar kan ändras beroende på hur man definerar när veckorna börjar om och vilken veckodag veckorna börjar med.

För att returnera en bild från en url måste först och främst ändra applikationens Content-Type till image.

Response.Clear();
Response.ContentType = "image/png";

För returnerna en png-bild behöver man spara bilden till en minnesström som sedan skrivs över till webbläsarens outputström. Används ingen minnesström får man felmeddelandet A generic error occurred in GDI+.

// Sparar bilden till minnesströmmen som sedan sparar bilden till utströmmen
using (MemoryStream stream = new MemoryStream()) {
button.Save(stream, ImageFormat.Png);
stream.WriteTo(Response.OutputStream);
}

Detta behöver inte göras när man hanterar gif eller jpeg-bilder. Då det räcker att spara bilden enligt följande:

// Sparar bilden till utströmmen
button.Save(Response.OutputStream, ImageFormat.Gif);

En enkel asp.net -applikation som returnerar en bloggknapp kan se ut så här:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.IO;
using System.Drawing;
using System.Web.Security;
using System.Drawing.Imaging;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Bitmap button = new Bitmap(80, 15);
Graphics g = Graphics.FromImage(button);

String text = "MerTeknik.se";
Font font = new Font("Courier", 7F, FontStyle.Regular);
SolidBrush wb = new SolidBrush(Color.White);
SolidBrush bb = new SolidBrush(Color.Black);

g.FillRectangle(bb, 0, 0, 80, 15);
g.FillRectangle(wb, 1, 1, 78, 13);
g.FillRectangle(bb, 2, 2, 76, 11);

g.DrawString(text, font, wb, 7F, 1F);

Response.Clear();
Response.ContentType = "image/png";

using (MemoryStream stream = new MemoryStream()) {
button.Save(stream, ImageFormat.Png);
stream.WriteTo(Response.OutputStream);
}
}
}

Resultat

Applikationen returnerar en bloggknapp från en vanlig .aspx -url:
bloggknapp

Det här exemplet passar utmärkt för dig som precis håller på att lära dig .net-programmering med c#. Exemplet visar hur du enkelt kan skapa ett BMI-test genom att läsa av textfält och anropa funktioner med knapptryck. För att kunna köra program måste du ha Visual studio med .net 2.0 eller 3.5 tillsammans med C#.

HTML-delen (Default.aspx)

Asp.net-sidor består vanligtvis av två separata sidor, en html-del och en code-behind del där programmeringen sker. På så sätt kan du enkelt och snyggt designa dina hemsidor och få en tydlig översikt över vad som händer.

Så här ser HTML-delen ut. Lägg märke till att formuläret inte består av traditionella taggar som tex <input>. Istället används <asp:TextBox> och <asp:Button> som sedan omvandlas till vanlig html automatiskt.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head>
        <title>Räkna ut bmi</title>
</head>
<body>
        <form id="form1" runat="server">
        <h1>Räkna ut ditt BMI</h1>
                <table>
                        <tr>
                                <th>Din längd:</th>
                                <td><asp:TextBox ID="length" runat="server" Columns="3" />cm</td>
                        </tr>
                        <tr>
                                <th>Din vikt:</th>
                                <td><asp:TextBox ID="weight" runat="server" Columns="3" />kg</td>
                        </tr>
                        <tr>
                                <td colspan="2"><asp:Button Text="Räkna ut bmi" runat="server" OnCommand="BMItest" /></td>
                        </tr>
                </table>
                <asp:Label runat="server" ID="result"></asp:Label>
        </form>
</body>
</html>

Ovan kan vi se ett enkelt forumulär där vi frågar användaren om indata. Lägg särskilt märke till input-fältens Id-nummer eftersom det är dessa som sedan används för att få tag på datat. Förutom fälten för indata finns även en knapp (asp:button) som anropar funktionen BMItest vid kommando.

KOD-delen (Default.aspx.cs)

Precis som i vanligt C#-programmering utgörs programmeringen med hjälp av klasser och objekt. När man skapar en ny sida i Visual studio skapas en kodfil automatiskt. Kodfilen har samma namn som den skapade sidan förutom filändelsen .cs (c-sharp).

På den här sidan har vi lagt in en funktion BMItest, dvs den funktion som anropas då användaren trycker på knappen ”Räkna ut bmi”.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {

        }

        protected void BMItest(object sender, EventArgs e) {

                string length_str = this.length.Text;
                string weight_str = this.weight.Text;

                try {

                        double length = Double.Parse(length_str) / 100;
                        double weight = Double.Parse(weight_str);

                        double bmi = weight / (length * length);

                        this.result.Text = "Ditt BMI är " + bmi;

                } catch (FormatException) {
                        this.result.Text = "Fel indata";
                }
        }
}

Datat hämtas genom de ID-nummer som vi specificerade in .aspx-filen. Övrig kod är precis som vanligt C# och vilket är lite utan tjusningar med Asp.net. Det går att skilja html från programmeringen på enkelt och snyggt sätt.

Tryck här för att se resultatet

För er som inte vet vad bmi är kan läsa om det på bmitest.se eller wikipedia.

wordpressWordpress är ett riktigt kraftigt blogg-verktyg och användbart för många, men om man får problem så är det inte alltid lätt att fixa utan några programmeringskunskaper.  Jag tänker här visa hur du gör så att sidebar även visas i inlägg och inte bara på startsidan.

På många teman idag så visas inte sidebar när man läser ett inlägg.  Många tycker säkert det är bra men om man vill visa den så gör man såhär:

  • Leta upp single.php på den design du valt.  Oftast ser det ut såhär wp-content/themes/temanamn/single.php
  • Öppna filen med till exempel notepad

Långt upp i filen står det:

<div id=”content” class=”widecolumn”>

Det ska du ändra till

<div id=”content” class=”narrowcolumn”>

Längst ner , precis över:

<?php get_footer(); ?>

Ska du lägga till:

<?php get_sidebar(); ?>

Det var allt! Nu ska allt förhoppningsvis funka.

2009-02-05

Mandelbrotfraktaler

Inlägget har blivit flyttat hit

Ifall du vill ändra ett tabelnamn i Mysql skriver du du:

RENAME TABLE gamla_namnet TO nya_namnet

Viktigt! Glömt inte att ändra de filer som ansluter till det gamla namnet.