سفارش تبلیغ
تبلیغات در پارسی بلاگ
این آگهی ارتباطی با نویسنده وبلاگ ندارد!
   

رشک بردن زن کفران است و رشک بردن مرد ایمان . [نهج البلاغه]

تازه‌نوشته‌هاآخرین فعالیت‌هامجموعه‌نوشته‌هافرزندانم

[بیشتر]

[بیشتر]

[بیشتر]

[بیشتر]

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
دفترچه راهنمای خودروی پژوی آردی + شنبه 94 تیر 6 - 7:47 عصر

باطری‌ساز گفت به هم ریخته است
فیوزهای ماشین
گفت: دفترچه راهنمایش را بیاور، تا از روی آن مرتب کنم!

در اینترنت گشتم
دنبال دفترچه راهنمای خودروی پژوی آردی
اما نیافتم
حتی نه در سایت خودروساز مربوطه!

خودروی پدرم تولید سال 1382 است
دفترچه‌اش را گرفتم
گفتم چرا ببرم باطری‌سازی؟!
مرتّب کردن چند فیوز که دیگر دشواری ندارد!

بعد هم به نظرم رسید چرا روی نت نگذارم؟!
شاید دیگران را نیز احتیاج افتد
بگذار این‌جا بجویند
این شد که صفحات مهم آن را اسکن کردم
نه همه
بلکه بخش‌هایی که اطلاعات در آن داشت
اطلاعاتی که شاید گاهی لازم شود

از این‌جا می‌توانید بردارید

حلال آردی‌سواران خوش‌اقبال! :)


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
تبدیل ساده تاریخ میلادی به شمسی در SQL Server + پنج شنبه 94 تیر 4 - 9:21 صبح

سال‌هاست که برای ذخیره تاریخ در SQL Server
یک فیلد رشته‌ای ده کاراکتری در نظر می‌گیرم
و باقی تغییر و تحوّلات را
می‌گذارم بر عهده کدهای برنامه

دیروز اما قصد داشتم گزارشی بنویسم از یک‌سری لاگ
و تاریخ‌ها همه میلادی ذخیره می‌شوند
به صورت خودکار و با تابع GETDATE داخل SQL Server
مبدّل‌هایی که داشتم
مربوط به کدهای داخل Net.
در اینترنت جستجو کردم و برای SQL Server
این‌که در داخل آن تبدیل را انجام دهم
این موارد را یافتم:

GETTING SHAMSI DATE FROM GREGORIAN DATE

How to convert Persian Or Jalali Calendar to Gregorian Calendar & vice versa In Sql Server

Creating a CLR Persian Date Convertor Function for SQL Server

Persian Date/Time support for MsSQL

وقتی تبدیل در قالب یک تابع در وسط‌های SELECT انجام می‌شود
کار سریع‌تر و ساده‌تر به انجام می‌رسد
دیگر نیاز نیست رکورد به رکورد بگیری و داخل کدهای برنامه تبدیل کنی
یک‌سره دیتا را می‌گیری و می‌فرستی برای کلاینت
تاریخ‌ها هم همه شمسی شده

اما با کدهای فوق به مشکلاتی برخوردم؛

دو مورد اول نتایج اشتباهی می‌دادند
ظاهراً در محاسبه سال کبیسه ایراد داشتند
و یک روز جلوتر حساب کردند

مورد سوم و چهارم هم رفته بودند سراغ کدهای داخل Net. اساساً
از قابلیتی استفاده کرده
که اجازه می‌دهد از داخل SQL Server به توابع Net. ارجاع شود
دنبال این پیچیدگی‌ها نبودم
یک کد ساده و روان می‌خواستم
که در قالب UDF مثلاً قابل اجرا باشد

ولی اتفاق جالبی افتاد
کد بسیار ساده‌ای در کامنت‌های این مطلب یافتم
کد مذکور از منطق ساده‌ای پیروی می‌کرد
ولی ایراد داشت
تصمیم گرفتم و کمی وقت گذاشتم
کد را یک‌بار به صورت کامل بررسی کردم
و بر اساس همان منطق ساده‌ای که داشت بازنویسی نمودم

CREATE FUNCTION [G2J] ( @intDate DATETIME )
RETURNS NVARCHAR(max)
BEGIN

DECLARE @shYear AS INT ,@shMonth AS INT ,@shDay AS INT ,@intYY AS INT ,@intMM AS INT ,@intDD AS INT ,@Kabiseh1 AS INT ,@Kabiseh2 AS INT ,@d1 AS INT ,@m1 AS INT, @shMaah AS NVARCHAR(max),@shRooz AS NVARCHAR(max),@DayCnt AS INT
DECLARE @DayDate AS NVARCHAR(max)

SET @intYY = DATEPART(yyyy, @intDate)

IF @intYY < 1000 SET @intYY = @intYY + 2000

SET @intMM = MONTH(@intDate)
SET @intDD = DAY(@intDate)
SET @shYear = @intYY - 622
SET @DayCnt = datepart(dw, "01/02/" + CONVERT(CHAR(4), @intYY))

SET @m1 = 1
SET @d1 = 1
SET @shMonth = 10
SET @shDay = 11

IF ( ( @intYY - 1993 ) % 4 = 0 ) SET @shDay = 12

WHILE ( @m1 != @intMM ) OR ( @d1 != @intDD )
BEGIN

  SET @d1 = @d1 + 1
  SET @DayCnt = @DayCnt + 1

  IF ( ( @intYY - 1992 ) % 4 = 0) SET @Kabiseh1 = 1 ELSE SET @Kabiseh1 = 0

  IF ( ( @shYear - 1371 ) % 4 = 0) SET @Kabiseh2 = 1 ELSE SET @Kabiseh2 = 0

  IF
  (@d1 = 32 AND (@m1 = 1 OR @m1 = 3 OR @m1 = 5 OR @m1 = 7 OR @m1 = 8 OR @m1 = 10 OR @m1 = 12))
  OR
  (@d1 = 31 AND (@m1 = 4 OR @m1 = 6 OR @m1 = 9 OR @m1 = 11))
  OR
  (@d1 = 30 AND @m1 = 2 AND @Kabiseh1 = 1)
  OR
  (@d1 = 29 AND @m1 = 2 AND @Kabiseh1 = 0)
  BEGIN
    SET @m1 = @m1 + 1
    SET @d1 = 1
  END

  IF @m1 > 12
  BEGIN
    SET @intYY = @intYY + 1
    SET @m1 = 1
  END
 
  IF @DayCnt > 7 SET @DayCnt = 1

 SET @shDay = @shDay + 1
 
  IF
  (@shDay = 32 AND @shMonth < 7)
  OR
  (@shDay = 31 AND @shMonth > 6 AND @shMonth < 12)
  OR
  (@shDay = 31 AND @shMonth = 12 AND @Kabiseh2 = 1)
  OR
  (@shDay = 30 AND @shMonth = 12 AND @Kabiseh2 = 0)
  BEGIN
    SET @shMonth = @shMonth + 1
    SET @shDay = 1
  END

  IF @shMonth > 12
  BEGIN
    SET @shYear = @shYear + 1
    SET @shMonth = 1
  END
 
END

IF @shMonth=1 SET @shMaah=N"فروردین"
IF @shMonth=2 SET @shMaah=N"اردیبهشت"
IF @shMonth=3 SET @shMaah=N"خرداد"
IF @shMonth=4 SET @shMaah=N"تیر"
IF @shMonth=5 SET @shMaah=N"مرداد"
IF @shMonth=6 SET @shMaah=N"شهریور"
IF @shMonth=7 SET @shMaah=N"مهر"
IF @shMonth=8 SET @shMaah=N"آبان"
IF @shMonth=9 SET @shMaah=N"آذر"
IF @shMonth=10 SET @shMaah=N"دی"
IF @shMonth=11 SET @shMaah=N"بهمن"
IF @shMonth=12 SET @shMaah=N"اسفند"

IF @DayCnt=1 SET @shRooz=N"شنبه"
IF @DayCnt=2 SET @shRooz=N"یکشنبه"
IF @DayCnt=3 SET @shRooz=N"دوشنبه"
IF @DayCnt=4 SET @shRooz=N"سه‌شنبه"
IF @DayCnt=5 SET @shRooz=N"چهارشنبه"
IF @DayCnt=6 SET @shRooz=N"پنجشنبه"
IF @DayCnt=7 SET @shRooz=N"جمعه"

SET @DayDate = @shRooz + " " + LTRIM(STR(@shDay,2)) + " " + @shMaah + " " + STR(@shYear,4)
--پنجشنبه 17 اردیبهشت 1394

/*
SET @DayDate = LTRIM(STR(@shDay,2)) + " " + @shMaah + " " + STR(@shYear,4)
--17 اردیبهشت 1394

SET @DayDate = STR(@shYear,4) + "/"+LTRIM(STR(@shMonth,2)) + "/" + LTRIM(STR(@shDay,2))
--1394/2/17

SET @DayDate = REPLACE(RIGHT(STR(@shYear, 4), 4), " ", "0") + "/"+ REPLACE(STR(@shMonth, 2), " ", "0") + "/" + REPLACE(( STR(@shDay,2) ), " ", "0")
--1394/02/17
*/
RETURN @DayDate
END

منطق آن چنین است:
از یک مبدأ مشترک میان تقویم شمسی و میلادی استفاده می‌کند
روزهای سال را می‌شمرد
یک‌بار برای میلادی
و یک‌بار برای شمسی
سر هر ماه که می‌رسد می‌پرد
کبیسه‌ها را هم به خوبی حساب می‌نماید
در نهایت وقتی تاریخ میلادی به روز مورد نظر رسید
همان‌جا می‌ایستد
و تاریخ شمسی را به عنوان خروجی عرضه می‌نماید
روش بسیار روشن و تمیزی به نظرم رسید

وقتی اصلاحات تمام شد
پاسخ خیلی دقیقی داد
درست همان پاسخی که انتظار داشتم

کد را گذاشتم که مورد استفاده مردمانم قرار گیرد
کافیست آن را در قالب یک تابع تعریف‌شده توسط کاربر (UDF)
استفاده کنید
مانند این:

SELECT CreateDate, G2J(CreateDate) AS Tarikh FROM MyTable

 CreateDate                   Tarikh
- - - - - - - - -          - - - - - - - - - - - - - -
06/19/2015          جمعه 29 خرداد 1394
06/23/2015          سه‌شنبه 2 تیر 1394

پی‌نوشت اول: (4 شهریور 94)
در یکی از نظرات
پیشنهادی طرح شد
مبنی بر این‌که فرمت خروجی تابع
از طریق پارامترهای ارسالی به آن تعیین شود
و دیگر نیازی به دستکاری کدها نباشد
این شد که تابع را به شکل زیر توسعه دادم:

CREATE FUNCTION dbo.[G2J] ( @intDate DATETIME, @Format NVARCHAR(max))
RETURNS NVARCHAR(max)
BEGIN
/* Format Rules: (پنجشنبه 7 اردیبهشت 1394)
ChandShanbe -> پنجشنبه (روز هفته به حروف)
ChandShanbeAdadi -> 6 (روز هفته به عدد)
Rooz -> 7 (چندمین روز از ماه)
Rooz2 -> 07 (چندمین روز از ماه دو کاراکتری)
Maah -> 2 (چندمین ماه از سال)
Maah2 -> 02 (چندمین ماه از سال دو کاراکتری)
MaahHarfi -> اردیبهشت (نام ماه به حروف)
Saal -> 1394 (سال چهار کاراکتری)
Saal2 -> 94 (سال دو کاراکتری)
Saal4 -> 1394 (سال چهار کاراکتری)
SaalRooz -> 38 (چندمین روز سال)
Default Format -> "ChandShanbe Rooz MaahHarfi Saal"
*/
DECLARE @shYear AS INT ,@shMonth AS INT ,@shDay AS INT ,@intYY AS INT ,@intMM AS INT ,@intDD AS INT ,@Kabiseh1 AS INT ,@Kabiseh2 AS INT ,@d1 AS INT ,@m1 AS INT, @shMaah AS NVARCHAR(max),@shRooz AS NVARCHAR(max),@DayCnt AS INT, @YearDay AS INT
DECLARE @DayDate AS NVARCHAR(max)

SET @intYY = DATEPART(yyyy, @intDate)

IF @intYY < 1000 SET @intYY = @intYY + 2000

SET @intMM = MONTH(@intDate)
SET @intDD = DAY(@intDate)
SET @shYear = @intYY - 622
IF (@Format IS NULL) OR NOT LEN(@Format)>0 SET @Format = "ChandShanbe Rooz MaahHarfi Saal"

SET @m1 = 1
SET @d1 = 1
SET @shMonth = 10
SET @shDay = 11
SET @DayCnt = datepart(dw, "01/02/" + CONVERT(CHAR(4), @intYY))
SET @YearDay = 276

IF ( ( @intYY - 1993 ) % 4 = 0 ) SET @shDay = 12
SET @YearDay = @YearDay + @shDay

WHILE ( @m1 != @intMM ) OR ( @d1 != @intDD )
BEGIN

 SET @d1 = @d1 + 1
 SET @DayCnt = @DayCnt + 1

 IF ( ( @intYY - 1992 ) % 4 = 0) SET @Kabiseh1 = 1 ELSE SET @Kabiseh1 = 0

 IF ( ( @shYear - 1371 ) % 4 = 0) SET @Kabiseh2 = 1 ELSE SET @Kabiseh2 = 0

 IF
 (@d1 = 32 AND (@m1 = 1 OR @m1 = 3 OR @m1 = 5 OR @m1 = 7 OR @m1 = 8 OR @m1 = 10 OR @m1 = 12))
 OR
 (@d1 = 31 AND (@m1 = 4 OR @m1 = 6 OR @m1 = 9 OR @m1 = 11))
 OR
 (@d1 = 30 AND @m1 = 2 AND @Kabiseh1 = 1)
 OR
 (@d1 = 29 AND @m1 = 2 AND @Kabiseh1 = 0)
 BEGIN
  SET @m1 = @m1 + 1
  SET @d1 = 1
 END

 IF @m1 > 12
 BEGIN
  SET @intYY = @intYY + 1
  SET @m1 = 1
 END
 
 IF @DayCnt > 7 SET @DayCnt = 1

SET @shDay = @shDay + 1
SET @YearDay = @YearDay + 1
 
 IF
 (@shDay = 32 AND @shMonth < 7)
 OR
 (@shDay = 31 AND @shMonth > 6 AND @shMonth < 12)
 OR
 (@shDay = 31 AND @shMonth = 12 AND @Kabiseh2 = 1)
 OR
 (@shDay = 30 AND @shMonth = 12 AND @Kabiseh2 = 0)
 BEGIN
  SET @shMonth = @shMonth + 1
  SET @shDay = 1
 END

 IF @shMonth > 12
 BEGIN
  SET @shYear = @shYear + 1
  SET @shMonth = 1
  SET @YearDay = 1
 END
 
END

IF @shMonth=1 SET @shMaah=N"فروردین"
IF @shMonth=2 SET @shMaah=N"اردیبهشت"
IF @shMonth=3 SET @shMaah=N"خرداد"
IF @shMonth=4 SET @shMaah=N"تیر"
IF @shMonth=5 SET @shMaah=N"مرداد"
IF @shMonth=6 SET @shMaah=N"شهریور"
IF @shMonth=7 SET @shMaah=N"مهر"
IF @shMonth=8 SET @shMaah=N"آبان"
IF @shMonth=9 SET @shMaah=N"آذر"
IF @shMonth=10 SET @shMaah=N"دی"
IF @shMonth=11 SET @shMaah=N"بهمن"
IF @shMonth=12 SET @shMaah=N"اسفند"

IF @DayCnt=1 SET @shRooz=N"شنبه"
IF @DayCnt=2 SET @shRooz=N"یکشنبه"
IF @DayCnt=3 SET @shRooz=N"دوشنبه"
IF @DayCnt=4 SET @shRooz=N"سه شنبه"
IF @DayCnt=5 SET @shRooz=N"چهارشنبه"
IF @DayCnt=6 SET @shRooz=N"پنجشنبه"
IF @DayCnt=7 SET @shRooz=N"جمعه"

SET @DayDate = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Format,"MaahHarfi",@shMaah),"SaalRooz",LTRIM(STR(@YearDay,3))),"ChandShanbeAdadi",@DayCnt),"ChandShanbe",@shRooz),"Rooz2",REPLACE(STR(@shDay,2), " ", "0")),"Maah2",REPLACE(STR(@shMonth, 2), " ", "0")),"Saal2",SUBSTRING(STR(@shYear,4),3,2)),"Saal4",STR(@shYear,4)),"Saal",LTRIM(STR(@shYear,4))),"Maah",LTRIM(STR(@shMonth,2))),"Rooz",LTRIM(STR(@shDay,2)))
/* Format Samples:
Format="ChandShanbe Rooz MaahHarfi Saal" -> پنجشنبه 17 اردیبهشت 1394
Format="Rooz MaahHarfi Saal" -> ـ 17 اردیبهشت 1394
Format="Rooz/Maah/Saal" -> 1394/2/17
Format="Rooz2/Maah2/Saal2" -> 94/02/17
Format="Rooz روز گذشته از MaahHarfi در سال Saal2" -> ـ 17 روز گذشته از اردیبهشت در سال 94
*/
RETURN @DayDate
END

اکنون باید این‌طور استفاده کنید:

SELECT CreateDate, G2J(CreateDate,"ChandShanbe Rooz MaahHarfi Saal") AS Tarikh FROM MyTable

 CreateDate                   Tarikh
- - - - - - - - -          - - - - - - - - - - - - - -
06/19/2015          جمعه 29 خرداد 1394
06/23/2015          سه‌شنبه 2 تیر 1394

اگر پارامتر دوم را خالی بفرستید
دو آپستروف مثلاً: ("",G2J(CreateDate
همان پیش‌فرض قبلی را خروجی می‌دهد
ولی یازده کلمه کلیدی وجود دارد
که با ارسال هر کدام
یا ترکیب‌شان
می‌توانید خروجی‌های متنوعی بگیرید.

پی‌نوشت دوم: (4 شهریور 94)
شاید شما هم متوجه شده باشید
قبلاً هم در سایت‌های معرفی شده فوق دیده بودم
این‌که از کندی چنین توابعی سخن به میان آمده
بالاخره یک فرآیند است
و این الگوریتم
منابع زیادی از سرور را مصروف می‌دارد
هر بار اجرای این کد که در سرور شخصی من حدود 40 میلی‌ثانیه زمان می‌برد
ولی وقتی حجم کار بالا می‌رود
خودم هم با این مشکل مواجه شدم
وقتی خواستم حدود یازده‌هزار رکورد را براساس تاریخ شمسی گروه‌بندی نمایم
در حالی که تاریخ میلادی در جدول ذخیره شده بود
من هم با تایم‌اوت مواجه شدم!

دیده بودم کسانی می‌آیند و جدول می‌سازند
برای تبدیل میلادی به شمسی
یا بالعکس
به نظر می‌رسد سرعت را بسیار بیشتر می‌کند

یک پروسیجر نوشتم
سال ابتدا و سال انتها را وارد می‌کنید
(در این نمونه 2015 و 2016)
تمام روزها را استخراج کرده
میلادی و شمسی و حتی به تفکیک
در یک جدول می‌ریزد (Miladi_Shamsi)

البته برای این‌کار از همان تابع بالا استفاده می‌کند
ببینید:

CREATE PROCEDURE dbo.Make_Convert_Date_Table
AS
BEGIN

 DECLARE @AzYear AS INT, @TaYear AS INT
 SET @AzYear = 2015
 SET @TaYear = 2016
 
 IF OBJECT_ID("dbo.Miladi_Shamsi", "U") IS NOT NULL
 DROP TABLE [dbo].[Miladi_Shamsi]
 
 CREATE TABLE [dbo].[Miladi_Shamsi] (
  [Miladi] smalldatetime NOT NULL,
  [ShamsiSlash] char(10) NULL,
  [ShamsiFull] nvarchar(30) COLLATE Persian_100_CI_AI NULL,
  [ShamsiRooz] int NULL,
  [ShamsiMaah] int NULL,
  [ShamsiSaal] int NULL,
  [ShamsiWeekDay] int NULL,
  PRIMARY KEY CLUSTERED ([Miladi])
 )

 DECLARE @CurDate AS DATETIME, @LastDate AS DATETIME
 SET @CurDate = CONVERT(DATETIME, "1/1/" + CONVERT(CHAR(4),@AzYear)) --MM/DD/YYYY
 SET @LastDate = CONVERT(DATETIME, "12/31/" + CONVERT(CHAR(4),@TaYear))
 DECLARE @Shamsi AS NVARCHAR(max), @Saal AS CHAR(4), @Maah AS CHAR(2), @Rooz AS CHAR(2), @ShanbeInt AS CHAR(1), @Shanbe AS NVARCHAR(10), @MaahH AS NVARCHAR(10)
 
 WHILE @CurDate <= @LastDate
 BEGIN

  SET @Shamsi = dbo.G2J(@CurDate,"Saal4Maah2Rooz2ChandShanbeAdadiChandShanbe|MaahHarfi") --139402175.$.
  SET @Saal = SUBSTRING(@Shamsi,1,4)
  SET @Maah = SUBSTRING(@Shamsi,5,2)
  SET @Rooz = SUBSTRING(@Shamsi,7,2)
  SET @ShanbeInt = SUBSTRING(@Shamsi,9,1)
  SET @Shanbe = SUBSTRING(@Shamsi,10,CHARINDEX("|",@Shamsi)-10)
  SET @MaahH = SUBSTRING(@Shamsi,CHARINDEX("|",@Shamsi)+1,10)

  INSERT INTO [dbo].[Miladi_Shamsi] ([Miladi],[ShamsiSlash],[ShamsiFull],[ShamsiRooz],[ShamsiMaah],[ShamsiSaal],[ShamsiWeekDay])
  VALUES (@CurDate,@Saal+"/"+@Maah+"/"+@Rooz,@Shanbe+" "+LTRIM(STR(CONVERT(INT,@Rooz),2))+" "+@MaahH+" "+@Saal,@Rooz,@Maah,@Saal,@ShanbeInt)

  SET @CurDate = @CurDate + 1
  
 END

END

پس از این‌که این جدول را ساختید
جدولی شبیه به این:

   Miladi      ShamsiSlash ShamsiRooz ShamsiMaah ShamsiSaal  ShamsiWeekDay        ShamsiFull           
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1/1/2015   1393/10/11      11              10           1393               6             پنجشنبه 11 دی 1393 
1/2/2015   1393/10/12      12              10           1393               7               جمعه 12 دی 1393

و در اختیار گرفتید
می‌توانید یک تابع میانی بسازید
مانند زیر:

CREATE FUNCTION dbo.[G2J_Fast] ( @intDate DATETIME)
RETURNS NVARCHAR(max)
BEGIN

DECLARE @Shamsi AS NVARCHAR(max)

SELECT @Shamsi=ShamsiFull FROM [Miladi_Shamsi]
WHERE Miladi=@intDate

IF @Shamsi IS NULL SET @Shamsi=dbo.G2J(@intDate,"")

RETURN @Shamsi
END

حالا یک تابع جدید به نام G2J_Fast داریم
که سریع‌تر از قبلی عمل می‌نماید
زیرا ابتدا به سراغ جدول Miladi_Shamsi می‌رود
اگر تاریخ میلادی را یافت که هیچ
شمسی را می‌گیرد و تقدیم می‌نماید
اما اگر تاریخ مذکور در گستره ذخیره شده نبود
آن را از تابع G2J فراخوانی می‌کند

بدین‌ترتیب ما یک روش هیبریدی در اختیار داریم
می‌توانیم جدول را در گستره‌ای که نیاز معمول‌مان است بسازیم
و برای حالت‌های خاص
گاهی که تاریخ مربوط به گذشته یا آینده دور است
از تابع تبدیل استفاده کنیم

از نظرات ارزشمندتان بهره‌مندم سازید
و اگر اصلاحی به نظرتان رسید
بفرمایید تا اعمال شود.

پی‌نوشت سوم: (4 شهریور 94)
فراموش نکنید که به جای کوتیشن‌مارک‌ها ("...") در کدها
باید آپستروف بگذارید (")
پارسی‌بلاگ به جهات امنیتی اجازه درج آپستروف در متن نمی‌دهد
این است که آپستروف‌ها را خودبه‌خود تبدیل به کوتیشن می‌کند
روی کدهای فوق قبل از درج در دیتابیس باید یک جستجوجایگزینی انجام دهید
تا مشکل حل شود!

پی‌نوشت چهارم: (5 شهریور 94)
برای آنان که جدول آماده معادل‌سازی‌شده میلادی_شمسی را می‌خواهند
این فایل را آماده کردم (http://movashah.id.ir/o/MiladiShamsi.txt)
با همین پروسیجر فوق ساخته شده
از سال 2010 تا 2020 را خروجی گرفتم (دی 1388 تا دی 1399)
یازده سال که می‌شود 4018 روز
(با احتساب سه روز اضافه به خاطر سه سال کبیسه)
می‌توانید با دیدن این نمونه صحّت تبدیل تابع G2J را مشاهده و بررسی بفرمایید
و یا به دیتابیس خود منتقل نموده و برای تبدیل استفاده کنید

پی‌نوشت پنجم: (17 آبان 94)
اشکالی در کد تابع وجود داشت
که در شماره روز هفته و نام روز اشتباه می‌کرد
یکی از بازدیدکنندگان وبلاگ تذکّر دادند
و مشکل مزبور مرتفع گردید

پی‌نوشت ششم: (17 آبان 94)
فراموش نکنیم که به دلیل مبتنی بودن تابع فوق بر دوره‌های چهارساله کبیسه
و عدم لحاظ کبیسه پنج‌ساله
تنها در یک بازه زمانی حدوداً 33 ساله صحیح عمل می‌کند
یعنی از 1371 تا تقریباً 1404 هـ ش
در قبل و بعد این دوره
احتمال بروز یک روز خطا وجود دارد
مگر این‌که تابع اصلاح شود و کبیسه‌های پنج‌ساله نیز در آن محاسبه گردند!

پی‌نوشت هفتم: (18 آبان 94)
یک کد سریع نوشته شده است
قطعاً بسیار سریع‌تر از کد فوق
زیرا این حلقه یکساله را ندارد
یک لوپ که همیشه از نخستین روز سال آغاز می‌شود
تا به روز مورد نظر برسد
توسط یکی از برنامه‌نویسان
که در نشانی http://mamehdi.parsiblog.com/Posts/1 قابل دسترسی‌ست
تست کردم
خروجی‌های کاملاً صحیحی می‌داد
فرمت ورودی و خروجی آن نیز کاملاً شبیه به همین تابع G2J است
کافیست هنگام نیاز به تبدیل تاریخ و استفاده از تابع
به جای dbo.G2J بنویسید dbo.SDAT
همان پاسخ را
البته که بسیار سریع‌تر
خواهد داد
با تشکر از این برادر بزرگوار!


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
نرم افزار بخش کردن کلمات اول دبستان + دوشنبه 93 اسفند 11 - 6:29 صبح

دانش‌آموز کلاس اولی دارید؟
پس این مطلب برای شماست!

من هم داشتم
پارسال داشتم
امسال هم دارم
سال بعد هم یکی دیگر خواهم داشت!
هر سال هم مجبور...
باید هر شب به آن‌ها دیکته می‌گفتم
از کلماتی که خوانده بودند
و جداولی
برای بخش کردن
معلم‌شان گفته بود با این جدول سریع‌تر روخوانی را یاد می‌گیرند
از خود پرسیدم:
«مگر رایانه نیامده که کارهای ما را آسان کند؟!»

برنامه کوچکی نوشتم
در حقیقت یک اسکریپت
تمام کلمات و واژه‌هایی را که یک دانش‌آموز دبستان
در کلاس اول
در کتاب می‌خواند را جمع کردم
بیش از 900 واژه شد
با چند کلمه‌ای که معلّم اضافه‌تر در سرمشق‌ها می‌داد

در یک فایل اکسل گذاشتم
می‌توانید از این‌جا بردارید
به صورت بخش‌بخش‌شده*

اسکریپت چهار کار برای من انجام می‌داد
جداولی درست می‌کند برای بخش کردن
حروف را انتخاب می‌کنم
شرایط را تعیین
جداولی می‌سازد با هر قلمی که بخواهم
معمولاً البته از «فراز» استفاده می‌کنم
شبیه‌تر است به قلم کتاب درسی‌شان

و جداولی برای ترکیب کردن
این‌که حروف در کنار هم چیده می‌شوند
حروف یک کلمه
که دانش‌آموز قبلاً خوانده است
بدون علامت‌ها
و او باید حروف را در کنار هم بچیند
و در ذهن خود
علامت‌ها را تصوّر نماید
تا آن را بخواند
و بنویسد

و سرمشق
برای خوش‌خط شدن
و البته برای یادگیری بهتر
به هر تعداد که بخواهم به صورت کم‌رنگ واژگان را ردیف می‌نماید
که او رونویسی کند
پررنگ کند یعنی

و اما برای دیکته
سخت است همیشه که کلماتی خوانده شده را به یاد بیاوری
تو که مشغول دیکته گفتن به بچه‌ای هستی که هنوز
بعضی از صداها را یاد نگرفته است
با این اسکریپت اما
من فقط حروف خوانده شده را می‌دهم
واژگانی را برایم ردیف می‌کند
که او خوانده است همه‌شان را
به همین سادگی!
فقط با یک کلیک!

برای من که بسیار راحت بود
و کارها را راحت کرد
گفتم بگذارم در نت
روی وبلاگ
به دیگران نیز بلکه منفعتی برساند
کافیست جداولی را که می‌خواهید بسازید
با برنامه‌ای که در این نشانی‌ست:
http://movashah.id.ir/e/aval.htm
که البته می‌توانید از این‌جا نیز دانلود کنید
برای خودتان
که بدون نیاز به اینترنت استفاده نمایید
و پس از مشاهده نتایج
دگمه‌های Ctrl+P را بفشارید
به صورت خودکار
عناصر اضافه از صفحه محو شده
و تنها و تنها نتایج
پرینت گرفته می‌شوند
با کروم البته می‌توانید مستقیماً به PDF خروجی بگیرید
که برای چاپ به بیرون ببرید!

* راستی اگر خواستید کلمات را بیشتر کنید
اضافه نمایید یعنی
فایل اکسل را بگشایید
فقط در ستون‌های «بخش»
کلمه را به صورت بخش‌بخش بنویسید
با کپی کردن آن‌ها به جعبه بالایی در اسکریپت
می‌توانید جداول کلمات خود را بسازید
من اطلاعات آن 900 واژه کتاب اول دبستان را فعلاً در جعبه بالایی اسکریپت وارد کرده‌ام
شما می‌توانید متناسب با نیاز خود تغییرش دهید!

لینک دریافت نرم‌افزار (بلافاصله پس از پرداخت، لینک دانلود در اختیار شما قرار می‌گیرد)


برچسب‌های مرتبط با این نوشته: فارسی 2 - آموزش 26 -
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
سامان دهی ایمیل با گو + جمعه 93 دی 19 - 2:31 عصر

بالاخره تمام شد
چند روز وقت گرفت
تمام اوقات فراغت این چند روز را کار کردم
اولین برنامه‌ام به زبان Go

احتمالاً شما نیز گرفتار دستیابی به ایمیل‌های قدیمی خود شده‌اید
ایمیل‌هایی که از سال‌ها پیش بایگانی شده‌اند
از روزهایی که با Outlook کار می‌کردیم
تا سرویس‌های مختلف تحت وب
همه را در فایل‌های eml نگهداشته بودم
و هر بار که دنبال ایمیلی می‌گشتم
زمان زیادی از دست می‌رفت

تصمیم گرفتم یک برنامه بنویسم
که تمام ده هزار فایل موجود را دسته‌بندی کند
بر اساس ایمیل فرستنده و گیرنده

زبان Go را گفتند خیلی سریع است
چند سالی‌ست که گوگل توسعه آن را آغاز کرده
جایی خواندم که ده برابر سریع‌تر از زبان‌های موجود

بسیار شبیه C و جاوا بود
تصمیم گرفتم تجربه کنم
خیلی دستورها را خلاصه کرده
و علامت‌‌های اضافی و بی‌کاربرد را پیراسته
قابلیت‌های جدیدی نیز افزوده
جالب‌ترین امکانش
بازگرداندن چندین مقدار از یک تابع، تنها با یک دستور بازگشت (!)

اگر چه ابزاری‌ست که بیشتر برای نوشتن Crawlerها
و ابزارهای سروری استفاده می‌شود
ولی من در اولین تجربه خود
این ابزار را با آن نوشتم
(نسخه غیر فشرده)

کار کردن با آن آسان است
کافیست در پوشه‌ای قرار دهید
که تمام فایل‌های eml در آن قرار دارد
همه در یک پوشه باشند
برنامه را که اجرا کنید
برای هر نشانی و آدرس یک پوشه می‌سازد
و تمام ایمیل‌های مربوط به آن نشانی را
در همان پوشه
بر اساس تاریخ قرار می‌دهد
نام فایل‌ها را به تاریخ و ساعت
که دسترسی آسان باشد
یک علامت R یا S هم در انتها
تا معلوم شود ارسالی‌ست یا دریافتی
و تمام

واقعاً سریع عمل کرد
من دقیقاً 10024 عدد فایل eml داشتم
از سال 2000 تا کنون
با حجم حدود 5 گیگابایت
از یاهو و جیمیل و هات‌میل هم در آن بود
و از سرورهای محلی دیگر
خروجی‌هایی که در تمام این سال‌ها گرفته
همه را در کمتر از 30 ثانیه دسته‌بندی کرد
برای دسترسی به فایل‌ها هم
می‌توان از ابزارهای خوبی مانند SysTools EML Viewer استفاده نمود

سورس برنامه این است:

package main

import (
    "io/ioutil"
    "strings"
    "time"
    "os"
    "io"
    "strconv"
)

var mFld,mPlc string
var FldCnt,MovCnt int

func main() {
    bLog("\r\n===\r\nExecuting at " + time.Now().Format("2006-01-02 15:04:05") + "\r\n")
    mFld = "~MovedEmails " + time.Now().Format("2006-01-02")
    mPlc = "AllMails " + time.Now().Format("2006-01-02")
    files, _ := ioutil.ReadDir("./")
    for _, f := range files {
          if fName := f.Name(); fName[len(fName)-4:]==".eml" {
                  bLog("Get File: "+fName+"\r\n")
                  fPath := mFld + "/" + fName
                  if _, err := os.Stat(fPath); os.IsNotExist(err) {
                      fDate,fFrom,fTo := fRead(fName)
                      mProc(fName,fDate + "-R",fTo)
                      mProc(fName,fDate + "-S",fFrom)
                      mMove(fName)
                      MovCnt++
                  }else{
                    bLog("Aborted Because Exists!\r\n")
                  }
          }
    }
    print("\nFinished: "+strconv.Itoa(MovCnt)+" Email Moved!\n")
    bLog("\r\nAll Folder Created: "+strconv.Itoa(FldCnt))
    bLog("\r\nAll Emails Moved: "+strconv.Itoa(MovCnt)+"\r\n")
    bLog("\r\nFinished at " + time.Now().Format("2006-01-02 15:04:05") + "\r\n\r\n\r\n")
}

func fRead(fName string)(fDate,fFrom,fTo string) {
  dat, err := ioutil.ReadFile(fName)
  check(err)
  fCon := string(dat)
  fFrom = gPart(fCon,"From")
  fTo = gPart(fCon,"To")
  fDate = gPart(fCon,"Date")
  bLog("From: "+fFrom+" To: "+fTo+" Date: "+fDate+"\r\n")
  if pos := strings.Index(fTo,","); pos>-1 {
    fTo = fTo[:pos]
  }
  if pos := strings.Index(fDate,","); pos>-1 {
          fDate = strings.TrimSpace(fDate[pos+1:])
    if pos = strings.Index(fDate,"("); pos>-1 {
            fDate = strings.TrimSpace(fDate[:pos])
    }
  }
  if fDate != "NotFound" {
    fDate = cDate(fDate)
  }
  return fDate, fFrom, fTo
}

func check(e error) {
    if e != nil {
        //panic(e)
        bLog("\r\n---\r\n" + e.Error() + "\r\n---\r\n")
    }
}

func gPart(fText,pName string)(s string) {
  s = "NotFound"
  fStr := "\n" + pName + ": "
  fText = "\n" + fText
  pos := strings.Index(fText, fStr)
  if pos<0 {
    pos = strings.Index(fText, strings.ToLower(fStr))
  }
  if pos>-1 {
    npos := strings.Index(fText[pos+1:],"\n")
    s = fText[pos+len(fStr):pos+npos]
    if pos=strings.Index(s,"<"); pos>-1 && strings.Index(s[pos:],">")>0 {
      s = s[pos+1:pos+strings.Index(s[pos:],">")]
    }
  }
  return strings.TrimSpace(s)
}

func cDate (t string) string {
  var tForm string
  bLog("Date Convert From: " +t)
  if t[len(t)-1:]!="0" {
          tForm = "2 Jan 2006 15:04:05 MST"
  }else{
    tForm = "2 Jan 2006 15:04:05 -0700"
    if len(t)>26 {
            t=t[:26]
    }
    if len(t)==24  {
      t=t+"00"
    }
  }
  bLog(" By Fromat: " +tForm)
  dTime, err := time.Parse(tForm, t)
  check(err)
  rTime := strings.Replace(dTime.Format("2006-01-02-15:04:05"),":","",-1)
  bLog(" To: " +rTime+ "\r\n")
  return rTime
}

func mProc(AslName, FileDate, FolName string) {
  if len(FolName)>0 {
    if strings.Index(FolName,"undisclosed")>-1 {
      return
    }
    chs := "=+\\/!&":;,\"?<"
    for i:=0;i<len(chs);i++ {
            FolName=strings.Replace(FolName,chs[i:i+1],"",-1)
    }
    FolName=strings.TrimSpace(FolName)
    if _, err := os.Stat(mPlc); os.IsNotExist(err) {
      os.Mkdir(mPlc,0777)
      bLog("Make Root Folder: "+mPlc+"\r\n")
    }
    if _, err := os.Stat(mPlc + "/" + FolName); os.IsNotExist(err) {
      os.Mkdir(mPlc + "/" + FolName,0777)
      print("Email: "+FolName+"\n")
      bLog("Make Folder: "+FolName+"\r\n")
      FldCnt++
    }
    oPath := mPlc + "/" + FolName + "/" + FileDate
    fPath := oPath + ".eml"
    for i:=1;;i++ {
            if _, err := os.Stat(fPath); err == nil {
              fPath = oPath + "-" + strconv.Itoa(i) + ".eml"
            }else{
              break
            }
    }
                in, err := os.Open(AslName)
                check(err)
                defer in.Close()
          out, err := os.Create(fPath)
          check(err)
          io.Copy(out, in)
          bLog("File Copied: "+AslName+" To: "+fPath+"\r\n")
  }
}

func mMove(AslName string) {
       if _, err := os.Stat(mFld); os.IsNotExist(err) {
    os.Mkdir(mFld,0777)
    bLog("Make Backup Folder: "+mFld+"\r\n")
        }
  fPath := mFld + "/" + AslName
  if _, err := os.Stat(fPath); os.IsNotExist(err) {
    os.Rename(AslName,fPath)
    bLog("File Moved: "+AslName+"\r\n")
  }
}

func bLog(payam string) {
  lName := "eml Organizer.log"
  f,err := os.OpenFile(lName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0660)
  check(err)
  defer f.Close()
  f.WriteString(payam)
}

می‌توانید از این نشانی بردارید

یک مشکل مهم دراستفاده از زبان برنامه‌نویسی Go وجود دارد
برای ما البته
شرکت تولیدکننده آن
همه IPهای داخل ایران را بسته است
فیلتر کرده یعنی
و نمی‌توان به سادگی به کتابخانه‌های آن دسترسی داشت
از همه بدتر
وقتی از github.com سورس‌های آماده را برمی‌داری
خیلی‌هایشان به بسته‌های گوگل ارجاع داده‌اند
که باز نمی‌شوند
و کامپایل نرم‌افزار را با مشکل روبه‌رو می‌سازند
من برای نوشتن این ابزار کوچک
فقط از کتابخانه‌های پیش‌فرض Go استفاده کردم

به عنوان ادیتور
از میان چند برنامه‌ای که تست نمودم
Zeus را از همه راحت‌تر یافتم
و با آن نوشتم

حالا که چه؟!
این‌که اکنون می‌توانم سوابق تمام مکاتبات اینترنتی خود را مرور کنم
و اطلاعات مفید و قابل استفاده را
باز استفاده نمایم!


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
نمودار مبادی اصول فقه + شنبه 93 آذر 15 - 9:1 عصر

دوره‌های اصلی بحث اصول استاد حسینی(ره)
همین 95 جلسه مبادی*
و 96 جلسه فلسفه اصول است
این‌طور که البته به ما اطلاع داده‌اند

دوره مبادی از اردیبهشت 1373 آغاز می‌شود
و گویا در مرداد 1376 پایان می‌یابد
سال 1387 کل آن دوره را مباحثه کردیم
اخیراً نیز قریب به یک‌سال است
دوباره مجالی فراهم شده
این‌بار با دقت بیشتری بحث می‌کنیم

مرحوم حسینی(ره) خودشان 30 جلسه ابتدای این دوره را
این‌طور دسته‌بندی کرده‌اند:

1. نسبت بین «ارتکازات عرفی» و «تکامل تعبّد»: جج 1-9
2. نسبت بین «قاعده‌مند شدن احتمالات» و «تعبّد»: جج 10-14
3. نسبت بین «احراز حجیّت شرعی» و «احتمالات مقنّن»: جج 15-21
4. نسبت بین «یقین» و «قوانین مفاهمه تکامل تعبّد»: جج 22-30

در این دوره بحث، عزم را جزم کردم
همین 30 جلسه نخست را خلاصه نمودم
خلاصه‌ای نموداری:

نمودار خیلی بزرگی شد
در پنج سرفصل اصلی گرد آمد
نمودار بزرگ و کامل را از اینجا بردارید

آن روزها که این جزوات را می‌خواندیم و بحث می‌کردیم
عناوین جدیدی برای هر جلسه تنظیم کردم
که در این نشانی قرار دارد

این‌بار که بحث می‌کردیم
یک دسته‌بندی هم برای این عناوین به نظرم آمد
که به نحو ذیل نظم یافت:

1. امکان ارتقاء فهم از کلمات شارع: جج 1-9
2. ضرورت تغییر مقیاس در فهم: جج 10 و 11
3. چگونگی تغییر مقیاس (بررسی احتمالات): جج 12-39
4. تعریف حجیّت: جج 18-39
5. تعریف یقین: جج 21-39
6. گرفتن حدّ فقه از علم کلام: جج 34-39
7. یقین اجتماعی: جج 43-49
8. حجیّت اجتماعی: ج 50
9. بازگشت به اول بحث و تطبیق با نظریه حجیّت اجتماعی: جج 51-63
10. ویژگی‌های فقه حکومتی: جج 64-77
11. فقهی شدن علم اصول: جج 78-95

در یک نگاه اجمالی
به نظر می‌رسد که در این دوره از اصول فقه
استاد حسینی(ره) این یازده سرفصل اصلی را
در طی 95 جلسه طرح می‌فرمایند.

* مبادی اصول فقه احکام حکومتی

پ.ن. نمودار پیوست چندان ویراسته نیست
همین‌طور که جزوات را می‌خواندم آن را رشد دادم
و همین‌‌طور که می‌خوانم اضافه می‌نمایم
این است که گاهی بحث‌ها در زیرشاخه‌ها با هم تشابهاتی دارند
که بهتر به نظر می‌رسد با هم ادغام شوند
اما به حسب این‌که در جلسات مختلف
و با عناوین متفاوت طرح شده‌اند
در این نمودار تلفیق نگشته‌اند
این نمودار بیشتر قصد دارد نمایانگر خلاصه‌ای از متن جلسات باشد
و تا می‌تواند از تحلیل و تفسیر بپرهیزد.


برچسب‌های مرتبط با این نوشته: سند 19 - آقامنیر 97 -
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
شرح فرمت اکسل + دوشنبه 93 شهریور 24 - 10:9 صبح

وقتی یک x به انتهای پسوند فایل‌های Office اضافه شد
فرمت ذخیره‌سازی آن‌ها تغییر مهمی کرد
مبتنی شد بر ساختار xml

با این تغییر مهم
مجموعه Office به محیط متن‌باز آمد
و امکان ساده‌ای فراهم کرد
تا هر برنامه‌ای بتواند به فایل‌های ذخیره‌سازی آن متصل شود

برنامه‌نویس هستید؟
اکنون به سادگی می‌توانید تمامی فایل‌های نرم‌افزارهای Office را باز کنید
من این‌جا فایل‌های نرم‌افزار اکسل را معرفی می‌کنم
فرمت xlsx
اطلاعاتی که می‌تواند برای دسترسی به داده‌های درون فایل
به شما یاری رساند

کافیست پسوند xlsx را به zip تغییر دهید
اکنون آن را که باز کنید
با مهم‌ترین پوشه مواجه خواهید شد: xl
اصلی‌ترین دیتای شما در این پوشه قرار دارد
از درون آن فایل workbook.xml را باز کنید
با یک متن‌خوان معمولی مانند Notepad
در داخل تگ <sheets></sheets> فهرست صفحات فایل اکسل خود را می‌بینید:

<sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets>

به مشخصه sheetId آن بنگرید
مراقب باشید این عدد شما را فریب ندهد
آن‌چه بیانگر فایل برگه اطلاعات است
آرایه‌ای‌ست که از یک آغاز می‌شود
آرایه‌ای که ایندکس آن برابر با چندمین تگ sheet است
حتماً باید یک فایل xml با همین شماره در پوشه worksheets داشته باشید
چیزی مانند: sheet1.xml
اگر سه تگ sheet داشته باشیم
فارغ از این‌که sheetId آن‌ها چه باشد
فایل‌های حاوی اطلاعات این برگه‌ها از یک شماره‌گذاری می‌شوند!
(مشخصه name فقط درون اکسل کاربرد دارد و بر روی برچسب صفحه نوشته می‌شود)

درون این فایل، فهرست مشخص‌کننده‌ای از ستون‌ها ذکر شده است
البته در صورتی‌که مشخصات ستون‌ها تغییر کرده باشد
و اکسل لازم بداند این اطلاعات را ثبت نماید:

    <cols>
        <col min="1" max="1" width="6.25" customWidth="1"/>
        <col min="2" max="2" width="71.875" style="1" customWidth="1"/>
        <col min="3" max="3" width="13.75" style="6" customWidth="1"/>
        <col min="4" max="4" width="9" style="7"/>
        <col min="5" max="5" width="11" style="7" customWidth="1"/>
        <col min="6" max="6" width="10.5" style="9" customWidth="1"/>
        <col min="7" max="7" width="13.5" style="10" customWidth="1"/>
        <col min="8" max="9" width="9" style="5"/>
    </cols>

و سپس اطلاعات کامل تمام سلول‌های صفحه اکسل را خواهید یافت
چیزی شبیه به این:

    <sheetData>
        <row r="1" spans="1:9" s="2" ht="29.25" x14ac:dyDescent="0.2">
            <c r="A1" s="2" t="s"><v>32</v></c>
            <c r="B1" s="3" t="s"><v>33</v></c>
            <c r="C1" s="4" t="s"><v>34</v></c>
            <c r="D1" s="4" t="s"><v>42</v></c>
            <c r="E1" s="4" t="s"><v>35</v></c>
            <c r="F1" s="2" t="s"><v>36</v></c>
            <c r="G1" s="2" t="s"><v>39</v></c>
            <c r="H1" s="2" t="s"><v>37</v></c>
            <c r="I1" s="2" t="s"><v>38</v></c>
        </row>
        <row r="2" spans="1:9" ht="43.5" x14ac:dyDescent="0.5">
            <c r="A2"><v>1029</v></c>
            <c r="B2" s="1" t="s"><v>45</v></c>
            <c r="C2" s="6" t="s"><v>44</v></c>
            <c r="D2" s="7"><v>22</v></c>
            <c r="E2" s="8" t="s"><v>40</v></c>
            <c r="F2" s="9" t="s"><v>43</v></c>
            <c r="G2" s="10" t="s"><v>0</v></c>
        </row>
    </sheetData>

اما عبارت‌های داخل هر سلول را نمی‌بینید
این اطلاعات برای صرفه‌جویی در حجم فایل‌های ذخیره‌سازی
و برای ادغام موارد تکراری
در یک فایل مشترک برای تمام صفحات اکسل نگهداری می‌شود
به این ترتیب حجم فایل صفحه‌ها هم کم شده
دسترسی به آن‌ها سریع‌تر صورت می‌پذیرد

یک فولدر به عقب برگردید
و فایل sharedStrings.xml را باز کنید
هر عبارت داخل هر سلول اکسل در تگ‌هایی ذخیره شده است، مانند:

<si><t>محتوای یک</t></si>
<si><t>محتوای دو</t></si>
<si><t>محتوای سه</t></si>

اگر همه اطلاعات این صفحه را در یک آرایه بریزید
آرایه‌ای که از صفر آغاز شود
شماره هر آرایه دقیقاً همان رفرنسی‌ست که در فایل صفحه ذکر شده است
یعنی اکسل به جای:

            <c r="A2"><v>محتوای صد و بیست و چهارم</v></c>

از این ترکیب استفاده کرده است:

 <c r="A2" t="s"><v>124</v></c>
 <si><t>محتوای صد و بیست و چهارم</t></si>

طبیعتاً برای سلول‌هایی که محتوای تکراری داشته باشند
تنها یک کد استفاده می‌شود

البته این ویژگی در همه سلول‌ها رعایت نمی‌شود
اگر مشخصه t مربوط به تگ <c> دارای مقدار s بود
یعنی محتوای سلول در فایل مشترک ذخیره شده
اما اگر چنین مشخصه‌ای نیافتید
در مواردی که محتوای سلول عدد باشد
یا فرمول
اکسل محتوای اصلی را در داخل تگ <v> قرار می‌دهد
و اگر فرمولی در کار باشد در داخل تگ <f>

این را نیز فراموش نفرمایید
که گاهی بیش از یک تگ <t> داخل <si> وجود دارد
در مواردی که اطلاعات داخل سلول فرمت داشته باشند
تغییر فونت و قلم و مانند آن
باید محتویات تمام تگ‌های <t> را بگیرید و به هم ملحق کنید
تا محتوای سلول را در اختیار داشته باشید

با دانستن این فرمت‌ها
دیگر لازم نیست برای Import اطلاعات اکسل به نرم‌افزار خود
آن را تبدیل به csv نمایید
مستقیم می‌توانید در برنامه خود فایل اکسل را باز کنید

پ.ن.
البته بیشتر برنامه‌نویس‌ها ترجیح می‌دهند از ابزارهای آماده برای باز کردن فایل‌های Office استفاده نمایند، ابزارهایی که برای باز کردن Open Document‌ها طراحی شده‌اند. (http://en.wikipedia.org/wiki/OpenDocument)


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
سایبان ارزان کولر آبی + چهارشنبه 93 مرداد 15 - 11:28 صبح

وقتی رسانه اعلام کرد
با گذاشتن سایبان روی کولر آبی
می‌شود تا 1000 لیتر در ماه در مصرف آب صرفه‌جویی کرد
برای این‌کار مصمّم شدم
هم هزینه قبض آب پایین می‌آید
هم آب بیشتری برای مصارف امت اسلام ذخیره می‌گردد

نمونه‌های زیادی در اینترنت وجود دارد
اما به راحتی در دسترس نیستند
بعضی هم که تبلیغات زیادی کرده‌اند
قیمت بالایی دارند
بالاتر از آن‌چه که خرید آنان را به صرفه نماید
آستین‌ها را بالا زدم
چهار لوله بخاری فراهم کردم و یک تکه برزنت

ایده‌ام این بود
یک پایه ضربدری از لوله‌ها
که برزنت را با فاصله از سقف کولر مهار کند

لوله‌ها ده سانت فاصله بین برزنت و کولر ایجاد می‌نمایند
هوا را هم عبور می‌دهند
برزنت هم اگر زیر تابش آفتاب داغ شود
حتی اگر هوای مابین برزنت و سقف دمایش بالا رود
جریان هوایی در آن میانه راه می‌افتد
و مانع گرم شدن زیاده از دمای هوا برای کولر می‌گردد

ابتدا از روش سنتی پوشاندن کولر خلاص شدم
تمام آشغال‌هایی را که تا به حال روی کولر گذاشته بودیم جمع کردم

سپس چند سوراخ روی سقف کولر با دریل
و روی لوله‌ها
با اندازه‌گیری دقیق
و نصب لوله‌ها با پیچ و مهره
پیچ و مهره‌های پهنی که معمولاً برای اتصال قفسه‌های فلزی کتابخانه‌ها استفاده می‌شود

وسط برزنت را سوراخ کردم
برای حرکت هوا
وقتی که هوای زیر برزنت به دلیل گرم‌شدن برزنت داغ می‌شود
با همان نوع پیچ و کمک گرفتن از واشرهای پهن
برزنت را متصل کردم

در نهایت هم دالبرهایی ایجاد کردم
دور برزنت
با قیچی
هم به زیبایی کار می‌افزود
هم دسترسی به پانل‌های کولر را ساده‌تر می‌کرد

زمان زیادی طول نکشید
تا تأثیر این روش مشخص شود
در آفتاب سوزان کویری شهر قم
بلافاصله خنکی چند برابر کولر را احساس کردم
خانه به طرز شگفت‌آوری خنک‌تر شد
خنک‌تر از آن‌چه تا کنون از کولر آبی مورد نظر انتظار می‌رفت

معمولاً در انبار هر خانه‌ای لوله‌های بخاری بی‌مصرف یافت می‌شود
برزنت‌های به کار رفته در تبلیغات شهری نیز فراوان است
من البته خریداری کردم
لوله‌ها هر کدام 3000 تومان
و برزنت هم متری 5000 تومان
تمام خرج این کار به 25000 تومان نرسید
مقایسه معناداری با سایه‌بان‌های فروشی بازار دارد
که بعضی بالای صد هزار تومان قیمت دارند! *

گاهی وقتی آستین‌ها را بالا بزنیم و دست به کار شویم
خیلی کارها با هزینه‌ای بسیار کمتر ممکن می‌‌شوند!

* قیمت‌ها مربوط به سال 1393 هستند!

پی‌نوشت:
امسال (تابستان 1398) پارچه روی کولر پاره شد
در زمستان یعنی
از باد و برف و باران
پارچه قبلی را برداشتم
رفتم برزنت جدید خریدم
یک و نیم در یک و نیم متر
45 هزار تومان شد
وصل کردم جای قبلی



خیلی راحت
پیچ‌ها را باز کردم و دوباره بستم
خوب دوام آورد به نظرم
پنج سال کار کرد
93 نصب کرده بودم و امسال 98 است

یک کار دیگر هم کردم امسال
کلید «تست کولر» نصب کردم
این‌چه کاری‌ست که مدام باید داد بزنی:
«آب کولر رو بزن، حالا قطع کن، حالا موتور کولرو روشن کن، زیادو بزن...»



این را باید خود کولرساز‌ها می‌گذاشتند
نمی‌دانم چرا نمی‌کنند

از چهار سیمی که به کولر می‌رود
یکی به دو خروجی متصل می‌شود
آن «نول» است
سه تای دیگر یکی آب، یکی دور کند و دیگری دور تند است
برای هر کدام یک کلید بین‌راهی گذاشتم
حالا
کولر که روشن است می‌روم بالا
دگمه‌ها را قطع می‌کنم
پمپ آب و موتور قطع می‌شود
کارهای لازم که انجام شد
دوباره با اتصال کلیدها
هر بخش از کولر که بخواهی راه می‌افتد
تست می‌کنی یعنی
داد و هوار هم دیگر نمی‌خواهد
هر چند بار که بخواهم قطع و وصل! :)


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
خلاصه مبانی فقه حکومتی + سه شنبه 93 خرداد 6 - 3:13 عصر

این‌بار با دقت بیشتری جزوات را خواندم
مجموعه مباحث درس خارج استاد میرباقری را
در بحث مبانی فقه حکومتی
اصل جزوات در سایت دفتر موجود است: اینجا

خلاصه‌هایی برداشتم
به نظرم آمد در وبلاگ هم قرار دهم
شاید به کار دیگران بیاید
آنان‌که فرصت مطالعه کامل جزوات را ندارند

همه جلسات در یک نمودار بزرگ جمع شده: این نمودار

اگر بزرگ است و حجیم و سخت‌استفاده
به تفکیک در این نشانی‌هاست:
جلسه اول و دوم و سوم و چهارم و پنجم و ششم و هفتم و هشتم و نهم و دهم و یازدهم و دوازدهم و سیزدهم

إن‌شاءالله که چنین مباحثی گسترش یابد
و بیشتر و بیشتر مورد دقّت قرار گیرد.


برچسب‌های مرتبط با این نوشته: سند 19 -
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
تبدیل اطلاعات کتابخانه ملّی به اکسل + دوشنبه 92 اسفند 12 - 8:24 عصر

سخت می‌شود گاهی
بعضی کارهای پژوهشی
آن‌جاهایی که محتاج یک انتقال ساده اطلاعات است
و امکانش فراهم نیست
برنامه‌نویس یعنی فراهم نکرده است
امر ساده‌ای که متروک گذاشته

کتابخانه ملّی سایت مهمی‌ست (http://opac.nlai.ir)
اطلاعات مهمّی نیز دارد
یک جستجوی ساده که انجام دهید
متوجه اهمیت منبع‌شناسی آن می‌شوید

اما خروجی آن مناسب نیست
مناسب بسیاری از کارهایی که ما معمولاً با اطلاعات انجام می‌دهیم

ابزاری نوشتم
ابزارکی در واقع
از نظر فنی تنها یک «بوکمارک‌لت» است

آن‌چه در این نشانی قرار داده‌ام:


http://movashah.id.ir/mb

این ابزارک چنین به شما خروجی خواهد داد:

امید که به کار دوستان طلبه و پژوهشگران علوم اسلامی بیاید
و حقیر را از دعای خیر فراموش نفرمایند!


برچسب‌های مرتبط با این نوشته:
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

در صفحه نخست می‌خوانید:  انداختیم - مشق ِ معنوی - اصول تربیت فرزند 11 - باورنکردنی - راهپیمایی - لیست ِ جهیزیه - 
حقوق شهروندی + چهارشنبه 92 بهمن 16 - 8:10 عصر

پس از آن‌که منابع را مطالعه کردم
در این موضوع
چنین نموداری به دست آمد

نسخه کامل نمودار این‌جاست:
http://movashah.id.ir/o/citizen.png

و سپس یک صفحه متن
فقط برای توصیفی خلاصه
از آن‌چه فهمیدم:

شهروندی مترادف با واژه لاتین Citizenship اصطلاحی است که با پیدایش حکومت‌های دموکراتیک در غرب جایگزین واژه «تبعه» شد، واژه‌ای که پیش از آن برای توصیف «فرد» در نسبت «دولت-مردم» به کار گرفته می‌شد.

این واژه به صورت‌های گوناگون تعریف شده که مشهورترین آن‌ها مشتمل بر افرادی است که در محدوده جغرافیایی مشخص و تحت حاکمیت یک دولت سیاسی واحد، ملزم به رعایت قوانین و دارای حقوقی معیّن می‌باشند.

به نظر پاره‌ای از کارشناسان، این اصطلاح در حقیقت در برابر رژیم‌های سلطنتی مستبدی پدید آمده که جوامع را به صورت طبقاتی اداره نموده و تفاوت مشخصی بین حقوق اشراف و نجیب‌زادگان با رعایا، احرار با بردگان و سفیدپوستان با رنگین‌پوستان و حتی بین مردان و زنان معتقد بوده‌اند. پدید آمدن این مفهوم حاکی از مقابله با این نگاه به آحاد جامعه و بیانگر رویکردی برابر نسبت به حقوق مردم بوده است.

اما با نظر به تعالیم اسلام و سیره نبی مکرّم(ص) و اهل بیت عصمت و طهارت(ع) اساساً این مفهوم به صورت نهادینه در حکومت اسلامی وجود دارد و آن‏چه در قالب حقوق شهروندی بیان می‌شود، بخشی از تکالیف بیان شده در احکام اسلامی و قسمت عمده‌ای از اعتقادات کلامی اسلامی نسبت به انسان و خلقت اوست.

با پیدایش انقلاب اسلامی در قانون اساسی اصولی روشن در بیان حقوق مردم و انسان‌ها بیان شده است که پس از آن نیز در قوانین عادی در سه مورد مشخص تلاش شده ضمانت اجرایی بر مفاد آن ایجاد گردد. با تأسیس کمیسیون حقوق بشر اسلامی در قوه قضاییه (1373)، تصویب لایحه حقوق شهروندی در مجلس شورای اسلامی (1383) و موظف کردن دولت به تولید منشور حقوق شهروندی در قانون برنامه چهام توسعه (1384).

در آذرماه 1392 نیز دولت یازدهم پیش‌نویس اول منشور حقوق شهروندی را مشتمل بر سه فصل: قواعد عمومی، مهم‌ترین حقوق شهروندی و سازمان کار، توسعه و نظارت بر اجرای منشور، توسط معاونت حقوقی ریاست جمهوری و با مشارکت مرکز بررسی‌های استراتژیک خود تولید نموده و به صورت غیررسمی منتشر کرده است. فصل دوم آن شامل بیست عنوان مهم در تبیین حقوق شهروندی است. این منشور در پانزده ماده تنظیم شده است.

کارشناسان عمدتاً حقوق شهروندی را در چهار سرفصل: «حقوق سیاسی»، «حقوق اقتصادی»، «حقوق فرهنگی» و «حقوق قضایی» طرح می‌نمایند که پاره‌ای از آنان دو سرفصل «حقوق مدنی» و «حقوق اجتماعی» را نیز به چهار سرفصل قبلی اضافه نموده و بخش‌هایی از مفاد سرفصل‌های قبلی را به این دو منتقل نموده‌اند. «حق آزادی بیان» و «حق برابری در مقابل دادگاه» دو مورد از مهم‌ترین حقوق شهروندی برشمرده شده‌اند که مورد تأکید بیشتر کارشناسان می‌باشند.

در الگوی قدیمی (کلاسیک) شهروندی تنها از حقوق شهروندان سخن به میان می‌آمد، ولی امروزه در الگوی «شهروند کامل» به وظیفه اجتماعی شهروندان نیز در کنار حقوق آنان اشاره می‌شود. وظیفه مشترکی که تمامی شهروندان در حفظ و نگهداری جامعه خود دارند تا یک همبستگی اجتماعی و تعامل پویا پدید آورند. در این الگوی جدید از شهروندی، فرد انسانی در شبکه‌ای از تاریخ، گذشته، حال، سنّت‌‌ها، زبان و پیش‌‌باورهای اجتماعی تعریف می‌شود و نسبت به محیط اجتماعی خود و مشارکت در فعالیت‌های آن، هم «حق» و هم «تکلیف» دارد.

به نظرم آمد اصلاً
حقوق شهروندی زاییده اسلام است
زاییده ادیان توحیدی
متولّد از کلام انبیاء
کامل‌ترین حقوق شهروندی را خدا تعیین کرده است
خیلی دقیق‌تر از آن‌چه امروز طرح می‌شود

به گمانم باید یک حقوق شهروندی از متون دینی استخراج نماییم
که کف این‌ها ببُرد
طوری که ظلم شدید شبکه اقتصاد سرمایه‌داری
بر گرده ملت‌های دنیا
حتی شهروندان کشورهای غربی
نشان دهد و درمان نماید
رِبایی که تمام عرصه‌های زندگی امروز بشر را گرفته
و خون ملت‌ها را به شیشه کارتل‌ها می‌مکد
اقتصادی که اساسش هرمی است
پیچیده‌تر از شبکه‌های هرمی گلدکوئیستی
غربی و شرقی و مسلمان و مسیحی و آتئیست هم نمی‌شناسد
اساس کاپیتالیسم بر هدم حقوق شهروندی مبتنی‌ست

همه مردم دنیا امروز دچار فقدان حقوق بشرند
فقدان حقوق شهروندی
و خودشان در جهالت...


برچسب‌های مرتبط با این نوشته: سند 19 -
نوشته شده توسط: سید مهدی موشَّح نظرات شما ^

<      1   2   3   4      >

جمعه 98 اسفند 2

امروز:  بازدید

دیروز:  بازدید

کل:  بازدید

برچسب‌های نوشته‌ها
فرزند عکس مباحثه سیده مریم سید احمد سید مرتضی اقتصاد آقامنیر فرهنگ فلسفه آشپزی خانواده کار مدرسه سفر آموزش بازی سند روحانیت فاصله طبقاتی خواص هنر فیلم دشمن جوجه انشا کتاب خودم خیاطی نهج‌البلاغه تاریخ ورزش فارسی سیدمرتضی طلاق
آشنایی
فعالیت‏‌ها 2 - شاید سخن حق
السلام علیک
یا أباعبدالله
سید مهدی موشَّح
آینده را بسیار روشن می‌بینم. شور انقلابی عجیبی در جوانان این دوران احساس می‌کنم. دیدگاه‌های انتقادی نسل سوم را سازگار با تعالی مورد انتظار اسلام تصوّر می‌نمایم. به حضور خود در این عصر افتخار کرده و از این بابت به تمام گذشتگان خود فخر می‌فروشم!
فهرست

[خـانه]

 RSS     Atom 

[پیام‌رسان]

[شناسـنامه]

[سایت شخصی]

[نشانی الکترونیکی]

 

شناسنامه
نام: سید مهدی موشَّح
نام مستعار: موسوی
جنسیت: مرد
استان محل سکونت: قم
زبان: فارسی
سن: 39
تاریخ تولد: 14 بهمن 1358
تاریخ عضویت: 20/5/1383
وضعیت تاهل: طلاق
شغل: خانه‌دار
تحصیلات: کارشناسی ارشد
وزن: 115
قد: 182
آرشیو
بیشترین نظرات
بیشترین دانلود
طراح قالب
خودم
آری! طراح این قالب خودم هستم... زمانی که گرافیک و Html و جاوااسکریپت‌های پارسی‌بلاگ را می‌نوشتم، این قالب را طراحی کردم و پیش‌فرض تمام وبلاگ‌های پارسی‌بلاگ قرار دادم.
البته استفاده از تصویر سرستون‌های تخته‌جمشید و نمایی از مسجد امام اصفهان و مجسمه فردوسی در لوگو به سفارش مدیر بود.

در سال 1383

تعداد بازدید