سیاوش نامه

توضیحات در مورد موضوعات گسسته‌ای که من باهاشون سر و کار دارم از قبیل موسیقی، حسابداری، برنامه‌نویسی و اجتماع

سیاوش نامه

توضیحات در مورد موضوعات گسسته‌ای که من باهاشون سر و کار دارم از قبیل موسیقی، حسابداری، برنامه‌نویسی و اجتماع

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

  • ۰
  • ۰

برای این که بتونم بین گزینه‌هایی که داریم بهترین رو برای شرکت انتخاب کنم نیاز دارم که یه راهنما داشته باشم. چطور نرم افزار را بسنجم و چه شاخصهایی رو براش در نظر بگیرم.


یه چرخی زدم و به موارد زیر رسیدم.

اتکا پذیری: 

نرم افزار داده ها رو به طور صحیح ثبت و گزارش میکنه؟ 

آیا در سه لایه رابط کاربر، هسته و پایگاه داده کنترل برای صحت سنجی اطلاعات ورودی وجود داره؟

نرم افزار تحمل قطعی شبکه، برق و شرایط غیر منتظره رو داره؟


سرعت نرم افزار:

داده های بزرگ رو با چه سرعتی میخونه؟ مثلا یه سند ۱۰۰۰ سطری رو از روی اکسل با چه سرعتی ثبت میکنه؟

فرم‌ها روان باز و بسته میشن؟


یکپارچگی:

آیا ظاهر ماجولهای مختلف نرم افزار همسان است؟

آیا طریقه ارتباط کاربر با همه ماجولها یکسان است؟

آیا فرمت اطلاعات ورودی و خروجی در همه ماجولها یکسان است؟

آیا انتقال داده بین ماجولها به شکل Seamless است؟

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


تکنولوژی ساخت:

آیا با توجه به نیاز به Scalability طراحی نرم افزار مناسب است؟

آیا از تکنولوژی روز برای ساخت نرم افزار استفاده شده؟

آیا تکنولوژی استفاده شده برای کاربری نرم افزار مناسب است؟ مثلا از یک زبان استریکت تایپ برای هسته سیستم استفاده شده؟


نگهداری:

تا چه عمقی یک کاربر عادی میتواند تنظیمات نرم‌افزار را تغییر دهد؟

تا چه حدودی یک کاربر وارد میتواند به امکانات برنامه اضافه کند؟

در کاربری روز مره چند مرتبه کاربر عادی به مشکلی برخورد میکند که قادر به رفع آن نیست؟


کاربری:

رابط کاربری برای استفاده نرم افزار مناسب است؟

تا چه حد کاربر دوست است؟

ورودی و خروجی به فرمتهای مختلف از جمله HTML، XML، JSON، CSV، و اکسل را دارد؟

نرم افزار ای پی آی در اختیار کاربر برای ارتباط با هسته قرار میدهد؟


امنیت:

اصول امنیتی در نرم افزار رعایت شده؟

  • سیاوش کسروی
  • ۰
  • ۰

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

  • سیاوش کسروی
  • ۰
  • ۰

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

به همین علت یه اسکریپت درست کردم که با نصب تمپرمانکی قابل اجرا است. این اسکریپت رنگ زمینه رو به زرد تغییر میده تا چشم آزار نباشه.

  • سیاوش کسروی
  • ۱
  • ۰

I like to analyze the calculator in Expressions chapter of C++ Programming Language. The calculator is a tiny compiler actually so I think it is worth digging the idea behind its implementation. Here is the grammar for the input language like "10*2+3":



 

program:
	end //end is end-of-input
	expr_list end
expr_list:
	expression print // print is newline or semicolon
	expression print expr_list
expression:
	expression + term
	expression − term
	term
term:
	term / primary
	term ∗ primary
	primary
primary:
	number //number is a floating-point literal
	name //name is an identifier
	name = expression
	−primary
	( expression )


What is says is that we call whole input string a program. The program is consisting of end and expression_list. Now what is that: expression print [expression_list]  in which the print is a character to mark the end of an expression like new line or semicolon. It says till now that a program may look like this:

"expression;expression;expression;"


It continues with defining what an expression is: a term or a term + or - an expression. A term is a primary or a primary  + or -  a term. What a primary is? It can be one of four things: a number, a name, a name=expression(and we know what an expression is already), -primary(negative of a primary) and an expression between parenthesis. According to this a number is a primary is a term and also an expression. If we add a semicolon it will be expr_list if our string is consisting of only this expr_list it is also a program.


So we give a string with this syntax to our program and the program calculates the results. Here is the implementation in C++:


#include
#include  // strings
#include  // map
#include  // isalpha(), etc.
#include 
#include 
using namespace std;
int no_of_errors;
map table;

double error(const string& s)
{
	no_of_errors++;
	cerr << "error: " << s << '\n';
	return 1;
}
enum class Kind : char {
	name, number, end,
	plus = '+', minus = '-', mul = '*', div = '/', print = ';', assign = '=', lp = '(', rp = ')'
};

struct Token {
	Kind kind;
	string string_value;
	double number_value;
};

class Token_stream {
public:
	Token_stream(istream& s) : ip{ &s }, owns{ false } { }
	Token_stream(istream* p) : ip{ p }, owns{ true } { }
	~Token_stream() { close(); }
	Token get(); // read and return next token
	Token& current() {		return ct;	}; // most recently read token
	void set_input(istream& s) { close(); ip = &s; owns = false; }
	void set_input(istream* p) { close(); ip = p; owns = true; }
private:
	void close() { if (owns) delete ip; }
	istream *ip; //pointer to an input stream
	bool owns; // does the Token_stream own the istream?
	Token ct{ Kind::end }; // current token
};

Token Token_stream::get()
{
	char ch = 0;
	*ip >> ch;
	switch (ch) {
	case 0:
		return ct = { Kind::end }; // assign and return
	case ';': // end of expression; print
	case '∗':
	case '/':
	case '+':
	case '-':
	case '(':
	case ')':
	case '=':
		return ct = {static_cast(ch)};
	case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
	case '.':
		ip->putback(ch); //put the first digit (or .) back into the input stream
		*ip >> ct.number_value; // read number into ct
		ct.kind = Kind::number;
		return ct;
	default: //name, name =, or error
		if (isalpha(ch)) {
			ip->putback(ch); //put the first character back into the input stream
			*ip >> ct.string_value; // read string into ct
			ct.kind = Kind::name;
			return ct;
		}
		error("bad token");
		return ct = { Kind::print };
	}
}


Token_stream ts{ cin };

double expr(bool get);


double prim(bool get) // handle primaries
{
	if (get) ts.get(); // read next token
	switch (ts.current().kind) {
	case Kind::number: // floating-point constant
	{ 
		double v = ts.current().number_value;
		ts.get();
		return v;
	}
	case Kind::name:
	{ 
		double& v = table[ts.current().string_value]; // find the corresponding
		if (ts.get().kind == Kind::assign) v = expr(true); // ’=’ seen: assignment
		return v;
	}
	case Kind::minus: // unar y minus
		return -prim(true);
	case Kind::lp:
	{
		auto e = expr(true);
		if (ts.current().kind != Kind::rp) return error("')' expected");
		ts.get(); // eat ’)’
		return e;
	}
	default:
		return error("primary expected");
	}
}
double term(bool get) // multiply and divide
{
	double left = prim(get);
	for (;;) {
		switch (ts.current().kind) {
		case Kind::mul:
			left *= prim(true);
			break;
		case Kind::div:
			if (auto d = prim(true)) {
				left /= d;
				break;
			}
			return error("divide by 0");
		default:
			return left;
		}
	}
}

double expr(bool get) // add and subtract
{
	double left = term(get);
	for (;;) { // ‘‘forever’’
		switch (ts.current().kind) {
		case Kind::plus:
			left += term(true);
			break;
		case Kind::minus:
			left -= term(true);
			break;
		default:
			return left;
		}
	}
}

void calculate()
{
	for (;;) {
		ts.get();
		if (ts.current().kind == Kind::end) break;
		if (ts.current().kind == Kind::print) continue;
		cout << expr(false) << '\n';
	}
}

int main(int argc, char* argv[])
{
	switch (argc) {
	case 1: // read from standard input
		break;
	case 2: // read from argument string
		ts.set_input(new istringstream{ argv[1] });
		break;
	default:
		error("too many arguments");
		return 1;
	}
	table["pi"] = 3.1415926535897932385; // insert predefined names
	table["e"] = 2.7182818284590452354;
	calculate();
	return no_of_errors;
}

So lets look how it works. It simply has a function for each expression and breaks them down as grammar dictates. Real work starts in calculate(). It ts.get() to get the first token and calls expr(false) on it. false says don't read another token and handle the current one (as one is already read). expr() calls term on current token and term calls prim on it. This way expr() breaks down all strings to primary tokens. expr() goes ahead for all + and -s term() goes ahead for all * and /s and prim() goes ahead for numbers and names. expr() calls term(), term calls prim(). prim() handles neg, parenthesis numbers, and names. It calls expr() for whatever between the parenthesis. Term handles multiplications and divisions and returns the result to expr(). Look what happens for a string like this: 10+8/4-14.

  1. Reads 10 and calls expr(). Our program knows the type of read token. In this case it is a number. expr() puts 10 in left an reads next token to see the next token is + or - by calling term() which consequently calls prim(). It calls term for the remaining part and adds or subtracts whatever is returned by term(). term returns numbers immediately after reading them.
  2. term() is called when expr() says case Kind::plus: left += term(true);
  3. term() reads the next token and sees it as a division so it calculates 8/4 and gives it to expr();
  4. expr() adds it to the previous value. So now we have 12 - 14.
  5. When expr() calls term() again in its loop it will get 14 and subtracts it from 12
  6. This time the next token is not + nor - so expr() finishes by returning the result.

Now to see it graphically we have:

exp-------term-------prim

|>---------->---------->|

|<----10---<---10----<|

10+|>------>--------->|

                 |<---8---<|

              8/|>------->|

              8/|<---4---<|

10+|<--2--<|

12-|>------->--------->|

12-|<--14-<----14---<|

-2

  • سیاوش کسروی
  • ۰
  • ۰

برای سرگرمی یک وب سایت درست کردم برای به اشتراک گذاری دانش حسابداری.

  • سیاوش کسروی
  • ۰
  • ۰

وارد دنیای وب شدم.


پایتون، جانگو، HTML، Java Script، HTTP و وب سرور. خیلی دنیای جالبیه. یه اسکریپت نوشتم رنگ پس زمینه صفحه های وب رو زرد میکنه.

  • سیاوش کسروی
  • ۰
  • ۰

آیا درآمد مخابرات از آن محل باعث کاهش تعرفه مکالمات و سایر سرویس‌های مخابرات میشه؟ این پیامک‌ها واقعا آزار دهنده و تحمیلی هستند.

  • سیاوش کسروی
  • ۰
  • ۰

«ماده 229 - اداره امور مالیاتی میتوانند برای رسیدگی به اظهارنامه یا تشخیص هرگونه درآمد مؤدی به کلیه دفاتر و

اسناد و مدارک مربوط مراجعه و رسیدگی نمایند و مؤدی مالیات مکلف به ارائه و تسلیم آنها میباشد وگرنه بعداً به نفع

او در امور مالیاتی آن سال قابل استناد نخواهد بود مگر آنکه قبل از تشخیص قطعی درآمد معلوم شود که ارائه آنها در

مراحل قبلی به عللی خارج از حدود اختیار مؤدی میسر نبوده است.» قانون مالیات‌های مستقیم، مصوب ۱۳۹۴/۰۴/۳۱


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


۱- اگر بنا باشد اداره مالیات دفاتر کلیه شرکت‌ها را رسیدگی کرده و مالیات آنان را به اصطلاح تشخیص دهد، دیگر چه نیازی است شرکت‌ها اظهارنامه ارسال کنند؟ صرف نگهداری دفاتر و تهیه صورت‌های مالی حسابرسی شده می‌تواند کافی باشد.


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


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





  • سیاوش کسروی
  • ۰
  • ۰

امروز با عزیزی مشغول تماشای فیلمی بودیم که پس از صحنه انفجاری در چند متری قهرمان داستان (که باعث شد به چند متر آن‌طرفتر پرتاب بشه) گفت ۵۰ سال طول کشید تا به کارگردان‌ها حالی کنن که انفجار موج داره، ۵۰ سال دیگه طول میکشه که یاد بدن موجش هم مرگباره.

  • سیاوش کسروی
  • ۰
  • ۰

خواستم یک نکته بگم در مورد عمل بینی که چند سال هست که ذهنم رو مشغول کرده. ممکنه بینی شما بزرگ باشه ولی الزاماً به این معنی نیست که نا زیباست. چهره های زیبایی رو دیدم با بینی‌های بزرگ. داشتیم مواردی توی همین خوب‌رویان که بعد از عمل با این که شکل بینی مشکلی نداشته دیگه اون قشنگی و نمک قبلی از چهرشون گرفته شده و من از این بابت خیلی متاسف شدم. به یاد داشته باشید شما هر زمان که بخواهید میتونید بینیتون رو عمل کنید ولی بعدش دیگه برگشتی وجود نداره.


  • سیاوش کسروی