Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  persian.rs

  Sprache: Rust
 

// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

//! This module contains types and implementations for the Persian calendar.
//!
//! ```rust
//! use icu::calendar::{Date, DateTime};
//!
//! // `Date` type
//! let persian_date = Date::try_new_persian_date(1348, 10, 11)
//!     .expect("Failed to initialize Persian Date instance.");
//!
//! // `DateTime` type
//! let persian_datetime =
//!     DateTime::try_new_persian_datetime(1348, 10, 11, 13, 1, 0)
//!         .expect("Failed to initialize Persian DateTime instance.");
//!
//! // `Date` checks
//! assert_eq!(persian_date.year().number, 1348);
//! assert_eq!(persian_date.month().ordinal, 10);
//! assert_eq!(persian_date.day_of_month().0, 11);
//!
//! // `DateTime` checks
//! assert_eq!(persian_datetime.date.year().number, 1348);
//! assert_eq!(persian_datetime.date.month().ordinal, 10);
//! assert_eq!(persian_datetime.date.day_of_month().0, 11);
//! assert_eq!(persian_datetime.time.hour.number(), 13);
//! assert_eq!(persian_datetime.time.minute.number(), 1);
//! assert_eq!(persian_datetime.time.second.number(), 0);
//! ```

use crate::any_calendar::AnyCalendarKind;
use crate::calendar_arithmetic::{ArithmeticDate, CalendarArithmetic};
use crate::iso::Iso;
use crate::{types, Calendar, CalendarError, Date, DateDuration, DateDurationUnit, DateTime, Time};
use ::tinystr::tinystr;
use calendrical_calculations::helpers::I32CastError;
use calendrical_calculations::rata_die::RataDie;

/// The Persian Calendar
///
/// The [Persian Calendar] is a solar calendar used officially by the countries of Iran and Afghanistan and many Persian-speaking regions.
/// It has 12 months and other similarities to the Gregorian Calendar
///
/// This type can be used with [`Date`] or [`DateTime`] to represent dates in this calendar.
///
/// [Persian Calendar]: https://en.wikipedia.org/wiki/Solar_Hijri_calendar
///
/// # Era codes
///
/// This calendar supports only one era code, which starts from the year of the Hijra, designated as "ah".
///
/// # Month codes
///
/// This calendar supports 12 solar month codes (`"M01" - "M12"`)
#[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq, PartialOrd, Ord)]
#[allow(clippy::exhaustive_structs)]
pub struct Persian;

#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd, Ord)]

/// The inner date type used for representing [`Date`]s of [`Persian`]. See [`Date`] and [`Persian`] for more details.
pub struct PersianDateInner(ArithmeticDate<Persian>);

impl CalendarArithmetic for Persian {
    type YearInfo = ();

    fn month_days(year: i32, month: u8, _data: ()) -> u8 {
        match month {
            1..=6 => 31,
            7..=11 => 30,
            12 if Self::is_leap_year(year, ()) => 30,
            12 => 29,
            _ => 0,
        }
    }

    fn months_for_every_year(_: i32, _data: ()) -> u8 {
        12
    }

    fn is_leap_year(p_year: i32, _data: ()) -> bool {
        calendrical_calculations::persian::is_leap_year(p_year, _data)
    }

    fn days_in_provided_year(year: i32, _data: ()) -> u16 {
        if Self::is_leap_year(year, ()) {
            366
        } else {
            365
        }
    }

    fn last_month_day_in_year(year: i32, _data: ()) -> (u8, u8) {
        if Self::is_leap_year(year, ()) {
            (1230)
        } else {
            (1229)
        }
    }
}

impl Calendar for Persian {
    type DateInner = PersianDateInner;
    fn date_from_codes(
        &self,
        era: types::Era,
        year: i32,
        month_code: types::MonthCode,
        day: u8,
    ) -> Result<Self::DateInner, CalendarError> {
        let year = if era.0 == tinystr!(16"ah") || era.0 == tinystr!(16"persian") {
            year
        } else {
            return Err(CalendarError::UnknownEra(era.0self.debug_name()));
        };

        ArithmeticDate::new_from_codes(self, year, month_code, day).map(PersianDateInner)
    }

    fn date_from_iso(&self, iso: Date<Iso>) -> PersianDateInner {
        let fixed_iso = Iso::fixed_from_iso(*iso.inner());
        Self::fast_persian_from_fixed(fixed_iso)
    }

    fn date_to_iso(&self, date: &Self::DateInner) -> Date<Iso> {
        let fixed_persian = Persian::fixed_from_fast_persian(*date);
        Iso::iso_from_fixed(fixed_persian)
    }

    fn months_in_year(&self, date: &Self::DateInner) -> u8 {
        date.0.months_in_year()
    }

    fn days_in_year(&self, date: &Self::DateInner) -> u16 {
        date.0.days_in_year()
    }

    fn days_in_month(&self, date: &Self::DateInner) -> u8 {
        date.0.days_in_month()
    }

    fn day_of_week(&self, date: &Self::DateInner) -> types::IsoWeekday {
        Iso.day_of_week(self.date_to_iso(date).inner())
    }

    fn offset_date(&self, date: &mut Self::DateInner, offset: DateDuration<Self>) {
        date.0.offset_date(offset, &())
    }

    #[allow(clippy::field_reassign_with_default)]
    fn until(
        &self,
        date1: &Self::DateInner,
        date2: &Self::DateInner,
        _calendar2: &Self,
        _largest_unit: DateDurationUnit,
        _smallest_unit: DateDurationUnit,
    ) -> DateDuration<Self> {
        date1.0.until(date2.0, _largest_unit, _smallest_unit)
    }

    fn year(&self, date: &Self::DateInner) -> types::FormattableYear {
        Self::year_as_persian(date.0.year)
    }

    fn is_in_leap_year(&self, date: &Self::DateInner) -> bool {
        Self::is_leap_year(date.0.year, ())
    }

    fn month(&self, date: &Self::DateInner) -> types::FormattableMonth {
        date.0.month()
    }

    fn day_of_month(&self, date: &Self::DateInner) -> types::DayOfMonth {
        date.0.day_of_month()
    }

    fn day_of_year_info(&self, date: &Self::DateInner) -> types::DayOfYearInfo {
        let prev_year = date.0.year.saturating_sub(1);
        let next_year = date.0.year.saturating_add(1);
        types::DayOfYearInfo {
            day_of_year: date.0.day_of_year(),
            days_in_year: date.0.days_in_year(),
            prev_year: Persian::year_as_persian(prev_year),
            days_in_prev_year: Persian::days_in_provided_year(prev_year, ()),
            next_year: Persian::year_as_persian(next_year),
        }
    }

    fn debug_name(&self) -> &'static str {
        "Persian"
    }
    // Missing any_calendar persian tests, the rest is completed
    fn any_calendar_kind(&self) -> Option<AnyCalendarKind> {
        Some(AnyCalendarKind::Persian)
    }
}

impl Persian {
    /// Constructs a new Persian Calendar
    pub fn new() -> Self {
        Self
    }

    fn fixed_from_fast_persian(p_date: PersianDateInner) -> RataDie {
        calendrical_calculations::persian::fixed_from_fast_persian(
            p_date.0.year,
            p_date.0.month,
            p_date.0.day,
        )
    }
    fn fast_persian_from_fixed(date: RataDie) -> PersianDateInner {
        let (year, month, day) =
            match calendrical_calculations::persian::fast_persian_from_fixed(date) {
                Err(I32CastError::BelowMin) => return PersianDateInner(ArithmeticDate::min_date()),
                Err(I32CastError::AboveMax) => return PersianDateInner(ArithmeticDate::max_date()),
                Ok(ymd) => ymd,
            };

        PersianDateInner(ArithmeticDate::new_unchecked(year, month, day))
    }

    fn year_as_persian(year: i32) -> types::FormattableYear {
        types::FormattableYear {
            era: types::Era(tinystr!(16"ah")),
            number: year,
            cyclic: None,
            related_iso: None,
        }
    }
}

impl Date<Persian> {
    /// Construct new Persian Date.
    ///
    /// Has no negative years, only era is the AH/AP.
    ///
    /// ```rust
    /// use icu::calendar::Date;
    ///
    /// let date_persian = Date::try_new_persian_date(1392, 4, 25)
    ///     .expect("Failed to initialize Persian Date instance.");
    ///
    /// assert_eq!(date_persian.year().number, 1392);
    /// assert_eq!(date_persian.month().ordinal, 4);
    /// assert_eq!(date_persian.day_of_month().0, 25);
    /// ```
    pub fn try_new_persian_date(
        year: i32,
        month: u8,
        day: u8,
    ) -> Result<Date<Persian>, CalendarError> {
        ArithmeticDate::new_from_ordinals(year, month, day)
            .map(PersianDateInner)
            .map(|inner| Date::from_raw(inner, Persian))
    }
}

impl DateTime<Persian> {
    /// Construct a new Persian datetime from integers.
    ///
    /// ```rust
    /// use icu::calendar::DateTime;
    ///
    /// let datetime_persian =
    ///     DateTime::try_new_persian_datetime(474, 10, 11, 13, 1, 0)
    ///         .expect("Failed to initialize Persian DateTime instance.");
    ///
    /// assert_eq!(datetime_persian.date.year().number, 474);
    /// assert_eq!(datetime_persian.date.month().ordinal, 10);
    /// assert_eq!(datetime_persian.date.day_of_month().0, 11);
    /// assert_eq!(datetime_persian.time.hour.number(), 13);
    /// assert_eq!(datetime_persian.time.minute.number(), 1);
    /// assert_eq!(datetime_persian.time.second.number(), 0);
    /// ```
    pub fn try_new_persian_datetime(
        year: i32,
        month: u8,
        day: u8,
        hour: u8,
        minute: u8,
        second: u8,
    ) -> Result<DateTime<Persian>, CalendarError> {
        Ok(DateTime {
            date: Date::try_new_persian_date(year, month, day)?,
            time: Time::try_new(hour, minute, second, 0)?,
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[derive(Debug)]
    struct DateCase {
        year: i32,
        month: u8,
        day: u8,
    }

    static TEST_FIXED_DATE: [i64; 21] = [
        656786664224671401694799702806704424708842709409709580727274728714,
        7393307393317443137634367634377646527751237754887754891317874,
    ];

    // Test data are provided for the range 1178-3000 AP, for which
    // we know the 33-year rule, with the override table, matches the
    // astronomical calculations based on the 52.5 degrees east meridian.
    static CASES: [DateCase; 21] = [
        // First year for which 33-year rule matches the astronomical calculation
        DateCase {
            year: 1178,
            month: 1,
            day: 1,
        },
        DateCase {
            year: 1198,
            month: 5,
            day: 10,
        },
        DateCase {
            year: 1218,
            month: 1,
            day: 7,
        },
        DateCase {
            year: 1282,
            month: 1,
            day: 29,
        },
        // The beginning of the year the calendar was adopted
        DateCase {
            year: 1304,
            month: 1,
            day: 1,
        },
        DateCase {
            year: 1308,
            month: 6,
            day: 3,
        },
        DateCase {
            year: 1320,
            month: 7,
            day: 7,
        },
        DateCase {
            year: 1322,
            month: 1,
            day: 29,
        },
        DateCase {
            year: 1322,
            month: 7,
            day: 14,
        },
        DateCase {
            year: 1370,
            month: 12,
            day: 27,
        },
        DateCase {
            year: 1374,
            month: 12,
            day: 6,
        },
        // First day that the 2820-year rule fails
        DateCase {
            year: 1403,
            month: 12,
            day: 30,
        },
        // First Nowruz that the 2820-year rule fails
        DateCase {
            year: 1404,
            month: 1,
            day: 1,
        },
        DateCase {
            year: 1417,
            month: 8,
            day: 19,
        },
        // First day the unmodified astronomical algorithm fails
        DateCase {
            year: 1469,
            month: 12,
            day: 30,
        },
        // First Nowruz the unmodified astronomical algorithm fails
        DateCase {
            year: 1470,
            month: 1,
            day: 1,
        },
        DateCase {
            year: 1473,
            month: 4,
            day: 28,
        },
        // Last year the 33-year rule matches the modified astronomical calculation
        DateCase {
            year: 1501,
            month: 12,
            day: 29,
        },
        DateCase {
            year: 1502,
            month: 12,
            day: 29,
        },
        DateCase {
            year: 1503,
            month: 1,
            day: 1,
        },
        DateCase {
            year: 2988,
            month: 1,
            day: 1,
        },
    ];

    fn days_in_provided_year_core(year: i32) -> u16 {
        let fixed_year =
            calendrical_calculations::persian::fixed_from_fast_persian(year, 11).to_i64_date();
        let next_fixed_year =
            calendrical_calculations::persian::fixed_from_fast_persian(year + 111)
                .to_i64_date();

        (next_fixed_year - fixed_year) as u16
    }

    #[test]
    fn test_persian_leap_year() {
        let mut leap_years: [i32; 21] = [021];
        // These values were computed from the "Calendrical Calculations" reference code output
        let expected_values = [
            falsefalsetruefalsetruefalsefalsefalsefalsetruefalsetruefalse,
            falsetruefalsefalsefalsefalsetruetrue,
        ];

        for (index, case) in CASES.iter().enumerate() {
            leap_years[index] = case.year;
        }
        for (year, bool) in leap_years.iter().zip(expected_values.iter()) {
            assert_eq!(Persian::is_leap_year(*year, ()), *bool);
        }
    }

    #[test]
    fn days_in_provided_year_test() {
        for case in CASES.iter() {
            assert_eq!(
                days_in_provided_year_core(case.year),
                Persian::days_in_provided_year(case.year, ())
            );
        }
    }

    #[test]
    fn test_fixed_from_persian() {
        for (case, f_date) in CASES.iter().zip(TEST_FIXED_DATE.iter()) {
            let date = Date::try_new_persian_date(case.year, case.month, case.day).unwrap();

            assert_eq!(
                Persian::fixed_from_fast_persian(*date.inner()).to_i64_date(),
                *f_date,
                "{case:?}"
            );
        }
    }
    #[test]
    fn test_persian_from_fixed() {
        for (case, f_date) in CASES.iter().zip(TEST_FIXED_DATE.iter()) {
            let date = Date::try_new_persian_date(case.year, case.month, case.day).unwrap();
            assert_eq!(
                Persian::fast_persian_from_fixed(RataDie::new(*f_date)),
                date.inner,
                "{case:?}"
            );
        }
    }

    #[test]
    fn test_day_of_year_info() {
        #[derive(Debug)]
        struct TestCase {
            input: i32,
            expected_prev: i32,
            expected_next: i32,
        }

        let test_cases = [
            TestCase {
                input: 0,
                expected_prev: -1,
                expected_next: 1,
            },
            TestCase {
                input: i32::MAX,
                expected_prev: i32::MAX - 1,
                expected_next: i32::MAX, // can't go above i32::MAX
            },
            TestCase {
                input: i32::MIN + 1,
                expected_prev: i32::MIN,
                expected_next: i32::MIN + 2,
            },
            TestCase {
                input: i32::MIN,
                expected_prev: i32::MIN, // can't go below i32::MIN
                expected_next: i32::MIN + 1,
            },
        ];

        for case in test_cases {
            let date = Date::try_new_persian_date(case.input, 11).unwrap();
            let info = Persian::day_of_year_info(&Persian, date.inner());

            assert_eq!(info.prev_year.number, case.expected_prev, "{:?}", case);
            assert_eq!(info.next_year.number, case.expected_next, "{:?}", case);
        }
    }

    // From https://calendar.ut.ac.ir/Fa/News/Data/Doc/KabiseShamsi1206-1498-new.pdf
    // Plain text version at https://github.com/roozbehp/persiancalendar/blob/main/kabise.txt
    static CALENDAR_UT_AC_IR_TEST_DATA: [(i32, bool, i32, u32, u32); 293] = [
        (1206false1827322),
        (1207false1828321),
        (1208false1829321),
        (1209false1830321),
        (1210true1831321),
        (1211false1832321),
        (1212false1833321),
        (1213false1834321),
        (1214true1835321),
        (1215false1836321),
        (1216false1837321),
        (1217false1838321),
        (1218true1839321),
        (1219false1840321),
        (1220false1841321),
        (1221false1842321),
        (1222true1843321),
        (1223false1844321),
        (1224false1845321),
        (1225false1846321),
        (1226true1847321),
        (1227false1848321),
        (1228false1849321),
        (1229false1850321),
        (1230true1851321),
        (1231false1852321),
        (1232false1853321),
        (1233false1854321),
        (1234true1855321),
        (1235false1856321),
        (1236false1857321),
        (1237false1858321),
        (1238true1859321),
        (1239false1860321),
        (1240false1861321),
        (1241false1862321),
        (1242false1863321),
        (1243true1864320),
        (1244false1865321),
        (1245false1866321),
        (1246false1867321),
        (1247true1868320),
        (1248false1869321),
        (1249false1870321),
        (1250false1871321),
        (1251true1872320),
        (1252false1873321),
        (1253false1874321),
        (1254false1875321),
        (1255true1876320),
        (1256false1877321),
        (1257false1878321),
        (1258false1879321),
        (1259true1880320),
        (1260false1881321),
        (1261false1882321),
        (1262false1883321),
        (1263true1884320),
        (1264false1885321),
        (1265false1886321),
        (1266false1887321),
        (1267true1888320),
        (1268false1889321),
        (1269false1890321),
        (1270false1891321),
        (1271true1892320),
        (1272false1893321),
        (1273false1894321),
        (1274false1895321),
        (1275false1896320),
        (1276true1897320),
        (1277false1898321),
        (1278false1899321),
        (1279false1900321),
        (1280true1901321),
        (1281false1902322),
        (1282false1903322),
        (1283false1904321),
        (1284true1905321),
        (1285false1906322),
        (1286false1907322),
        (1287false1908321),
        (1288true1909321),
        (1289false1910322),
        (1290false1911322),
        (1291false1912321),
        (1292true1913321),
        (1293false1914322),
        (1294false1915322),
        (1295false1916321),
        (1296true1917321),
        (1297false1918322),
        (1298false1919322),
        (1299false1920321),
        (1300true1921321),
        (1301false1922322),
        (1302false1923322),
        (1303false1924321),
        (1304true1925321),
        (1305false1926322),
        (1306false1927322),
        (1307false1928321),
        (1308false1929321),
        (1309true1930321),
        (1310false1931322),
        (1311false1932321),
        (1312false1933321),
        (1313true1934321),
        (1314false1935322),
        (1315false1936321),
        (1316false1937321),
        (1317true1938321),
        (1318false1939322),
        (1319false1940321),
        (1320false1941321),
        (1321true1942321),
        (1322false1943322),
        (1323false1944321),
        (1324false1945321),
        (1325true1946321),
        (1326false1947322),
        (1327false1948321),
        (1328false1949321),
        (1329true1950321),
        (1330false1951322),
        (1331false1952321),
        (1332false1953321),
        (1333true1954321),
        (1334false1955322),
        (1335false1956321),
        (1336false1957321),
        (1337true1958321),
        (1338false1959322),
        (1339false1960321),
        (1340false1961321),
        (1341false1962321),
        (1342true1963321),
        (1343false1964321),
        (1344false1965321),
        (1345false1966321),
        (1346true1967321),
        (1347false1968321),
        (1348false1969321),
        (1349false1970321),
        (1350true1971321),
        (1351false1972321),
        (1352false1973321),
        (1353false1974321),
        (1354true1975321),
        (1355false1976321),
        (1356false1977321),
        (1357false1978321),
        (1358true1979321),
        (1359false1980321),
        (1360false1981321),
        (1361false1982321),
        (1362true1983321),
        (1363false1984321),
        (1364false1985321),
        (1365false1986321),
        (1366true1987321),
        (1367false1988321),
        (1368false1989321),
        (1369false1990321),
        (1370true1991321),
        (1371false1992321),
        (1372false1993321),
        (1373false1994321),
        (1374false1995321),
        (1375true1996320),
        (1376false1997321),
        (1377false1998321),
        (1378false1999321),
        (1379true2000320),
        (1380false2001321),
        (1381false2002321),
        (1382false2003321),
        (1383true2004320),
        (1384false2005321),
        (1385false2006321),
        (1386false2007321),
        (1387true2008320),
        (1388false2009321),
        (1389false2010321),
        (1390false2011321),
        (1391true2012320),
        (1392false2013321),
        (1393false2014321),
        (1394false2015321),
        (1395true2016320),
        (1396false2017321),
        (1397false2018321),
        (1398false2019321),
        (1399true2020320),
        (1400false2021321),
        (1401false2022321),
        (1402false2023321),
        (1403true2024320),
        (1404false2025321),
        (1405false2026321),
        (1406false2027321),
        (1407false2028320),
        (1408true2029320),
        (1409false2030321),
        (1410false2031321),
        (1411false2032320),
        (1412true2033320),
        (1413false2034321),
        (1414false2035321),
        (1415false2036320),
        (1416true2037320),
        (1417false2038321),
        (1418false2039321),
        (1419false2040320),
        (1420true2041320),
        (1421false2042321),
        (1422false2043321),
        (1423false2044320),
        (1424true2045320),
        (1425false2046321),
        (1426false2047321),
        (1427false2048320),
        (1428true2049320),
        (1429false2050321),
        (1430false2051321),
        (1431false2052320),
        (1432true2053320),
        (1433false2054321),
        (1434false2055321),
        (1435false2056320),
        (1436true2057320),
        (1437false2058321),
        (1438false2059321),
        (1439false2060320),
        (1440false2061320),
        (1441true2062320),
        (1442false2063321),
        (1443false2064320),
        (1444false2065320),
        (1445true2066320),
        (1446false2067321),
        (1447false2068320),
        (1448false2069320),
        (1449true2070320),
        (1450false2071321),
        (1451false2072320),
        (1452false2073320),
        (1453true2074320),
        (1454false2075321),
        (1455false2076320),
        (1456false2077320),
        (1457true2078320),
        (1458false2079321),
        (1459false2080320),
        (1460false2081320),
        (1461true2082320),
        (1462false2083321),
        (1463false2084320),
        (1464false2085320),
        (1465true2086320),
        (1466false2087321),
        (1467false2088320),
        (1468false2089320),
        (1469true2090320),
        (1470false2091321),
        (1471false2092320),
        (1472false2093320),
        (1473false2094320),
        (1474true2095320),
        (1475false2096320),
        (1476false2097320),
        (1477false2098320),
        (1478true2099320),
        (1479false2100321),
        (1480false2101321),
        (1481false2102321),
        (1482true2103321),
        (1483false2104321),
        (1484false2105321),
        (1485false2106321),
        (1486true2107321),
        (1487false2108321),
        (1488false2109321),
        (1489false2110321),
        (1490true2111321),
        (1491false2112321),
        (1492false2113321),
        (1493false2114321),
        (1494true2115321),
        (1495false2116321),
        (1496false2117321),
        (1497false2118321),
        (1498true2119321),
    ];

    #[test]
    fn test_calendar_ut_ac_ir_data() {
        for (p_year, leap, iso_year, iso_month, iso_day) in CALENDAR_UT_AC_IR_TEST_DATA.iter() {
            assert_eq!(Persian::is_leap_year(*p_year, ()), *leap);
            let persian_date = Date::try_new_persian_date(*p_year, 11).unwrap();
            let iso_date = persian_date.to_calendar(Iso);
            assert_eq!(iso_date.year().number, *iso_year);
            assert_eq!(iso_date.month().ordinal, *iso_month);
            assert_eq!(iso_date.day_of_month().0, *iso_day);
        }
    }
}

Messung V0.5 in Prozent
C=89 H=100 G=94

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-06-18) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik