Python: کار با CSV

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

کتابخانه csv توی پایتون اندازه‌ای خوب، ساده و قدرتمند هست که شما به راحتی میتونید فایل‌های خودتون رو ایجاد کنید یا بخونید، این کتابخانه فایل csv رو بصورت یک آرایه در اختیار شما قرار میده. تنها کافیه فایل مورد نظر خودتون رو باز کنید(with open('data.csv', 'rb') as inp:)، توسط کتابخانه اون رو بخونید (myCSV = csv.reader(inp, delimiter=',', quotechar='|')) واز اون استفاده کنید.


1
2
3
4
with open('file.csv', 'rb') as inp:
myCSV = csv.reader(inp, delimiter=',', quotechar='|')
for line in myCSV:
key = line[0]+','+line[1]

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


1
2
3
4
5
with open('file.csv', 'rb') as inp:
myCSV = csv.reader(inp, delimiter=',', quotechar='|')
next(myCSV, None) # return header or None if file empty
for line in myCSV:
key = line[0]+','+line[1]

در مورد نوشتن هم شرایط بسیار مشابه با خوندن هست


1
2
3
4
5
6
7
8
9
10
11
12
13
14
with open('inp.csv', 'rb') as inp, open("out.csv", "wb") as outfile:
inp = csv.reader(inp, delimiter=',')
writer = csv.writer(outfile)
next(inp)
index = 0
for line in inp:
# .. do what you want
index += 1
if ( ... ): # a silly condition
writer.writerow([
index,
line[4],
... // some bullshit
])

IOS: محدود کردن کاراکتر‌های مجاز برای یک UITextField

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


در آی‌اواس اگر بخوایم جلوی این اتفاق رو بگیریم باید خودمون دست به کد بشیم و برای UITextField خودمون یک UITextFieldDelegate تعریف کنیم. اگر با تعریف Delegate و نحوه کار کردن و دلیل وجودی اون آشنا نیستید حتما حتما حتما بگردید و پیدا کنید و اطلاعات خودتون رو بالا ببرید در خیلی از موارد دلگیت روشن کننده راه هست توی iOS.
برای رفع این مشکل اول کنترلر خودتون رو تبدیل به یک delegate برای تکست‌فیلد کنید و تابع shouldChangeCharactersInRange رو توی اون پیاده‌سازی کنید. کاری که باید انجام بدیم ساده است، باید کاراکتری که قراره به تکست فیلد ما اضافه بشه رو بررسی کنیم و اگر جزو کاراکتر‌های غیر مجاز بود در این تابع مقدار false برگردونیم. اگر هم مجاز بود true.
خیلی جای حرف زدن نداره و بریم سراغ پیاده سازی تابع.

Objective-C


1
2
3
4
5
6
7
8
9
- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *myCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
NSRange r = [string rangeOfCharacterFromSet:s];
if (r.location != NSNotFound) {
return NO;
}
return YES;
}

Swift


1
2
3
4
5
6
7
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let invalid = NSCharacterSet(charactersInString: "1234567890").invertedSet //characters to block
if let _ = string.rangeOfCharacterFromSet(invalid) {
return false
}
return true
}

...

Salvador Dalí - Figure with Drawers for a Four-part Screen, c. 1934




; در جاوااسکریپت

شاید شما هم مثل من خیلی وقت ها موقع کد زدن با جاوا اسکریپت کمتر از ; استفاده میکنید چون توی جاوا اسکریپت بودن یا نبودن ; چندان فرقی نداره و کد شما بدون این کاراکتر هم بدرستی کار میکنه. تو شرایط عادی حق با من و شماست و فرقی نداره که ما از سمی کولون استفاده کنیم یا نه ولی شرایطی وجود دارند که ما باید از سمی کولون استفاده کنیم. برای مثال اگر شما کد زیر رو داشته باشید مطمئنا با خطای TypeError: undefined is not a function مواجه خواهید شد


1
2
3
4
5
6
var foo = function() {
console.log("foo")
}
(function(){
console.log("bar")
})()


برای رفع این مشکل تنها کافیه بعد از تعریف تابع foo یک سمی کولون بذاریم و دیگه خبری از خطای بالا نخواهد بود. دلیل این اتفاق ساده است، وقتی ; انتهای تابع گذاشته میشه کامپایلر متوجه میشه که یک عبارت تموم شده و بعد این باید دنبال عبارت جدید باشه پس تابع بی نام بعد از foo بصورت یک عبارت جدید پردازش میشه. ولی وقتی جدا کننده نداریم کامپایلر فرض میکنه که این دو یک عبارت هستند و ساختاری شبیه این دارند


1
function foo(){}()


پس باید موقع کد زدن دقت بیشتری داشته باشیم و بدونیم که کامپایلر چه برداشتی از کد ما میکنه

JAVA: اتصال به SQL Server

چند روز پیش لازم بود تا به SQL Server وصل بشیم و چندتا دامپ بگیریم از دیتابیس و خب ساده‌ترین و سربعترین راه برای گرفتن دامپ‌ها نوشتن کد با جاوا بود، پس کد نوشتیم براش. برای وصل شدن به SQL Server باید درایور JDBC اون رو دانلود رو توی Class Path جاوا قرار بدیم. برای دانبود درایور کافیه سرچ کنید sqljdbc4.jar. لینک اول دانلود درایور است.
اجازه بدید حرف‌های اصلی رو از زبون خود جاوا بشنویم


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.sql.*;
import java.io.*;
public class SQL2CSV{
public SQL2CSV() {
try {
Connection conn = this.dbConnect("jdbc:sqlserver://SERVER:PORT", "USER", "PASSWORD" );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM TABLE");
convertToCsv("EXPORT_CSV_FILE_PATH", rs);
rs.close();
stmt.close();
conn.close();
} catch( Exception e ){
e.printStackTrace();
}
}
public Connection dbConnect( String db_connect_string,
String db_userid,
String db_password){
try {
Class.forName( "com.microsoft.sqlserver.jdbc.SQLServerDriver" );
Connection conn = DriverManager.getConnection(
db_connect_string,
db_userid,
db_password);
System.out.println( "connected" );
return conn;
} catch( Exception e ){
e.printStackTrace();
return null;
}
}
public static void convertToCsv(String file, ResultSet rs) throws SQLException, FileNotFoundException {
PrintWriter csvWriter = new PrintWriter(new File(file)) ;
// write column names to file
ResultSetMetaData meta = rs.getMetaData() ;
int numberOfColumns = meta.getColumnCount() ;
String dataHeaders = "\"" + meta.getColumnName(1) + "\"" ;
for (int i = 2 ; i < numberOfColumns + 1 ; i ++ ) {
dataHeaders += ",\"" + meta.getColumnName(i) + "\"" ;
}
csvWriter.println(dataHeaders) ;
// write data
while (rs.next()) {
String row = "\"" + rs.getString(1) + "\"" ;
for (int i = 2 ; i < numberOfColumns + 1 ; i ++ ) {
row += ",\"" + rs.getString(i) + "\"" ;
}
csvWriter.println(row) ;
}
// close
csvWriter.close();
}
public static void main(String[] args){
new SQL2CSV();
}
}

خم کردن گوشه‌های یک UIView و حاشیه‌سازی برای آن

عنوان چقدر عجیب شده، اگر خودم این مطلب رو نمی‌نوشتم عمرا میتونستم با این عنوان بفهمم که داخل مطلب چی قراره گفته بشه. شاید گفتن انگلیسی اون بهتر باشه UIView border(corner) radius & border bottom

اگر بخوایم یک UIView داشته باشیم که گوشه‌های آن تیز نباشه چیکار باید انجام بدیم؟

اگر بخوایم همه گوشه‌ها رو باهم و به یک اندازه خم کنیم جواب خیلی ساده‌است، کافیه یک زیرکلاس از UIView (یا هر کلاس UI دیگری) بسازیم ودرون سازنده یا هرجای مناسب دیگه اون layer.cornerRadius رو تغییر بدیم.

Objective-C


1
2
3
4
- (void)initialise {
//round
self.layer.cornerRadius = 4.0f;
}

Swift


1
2
3
4
override func awakeFromNib() {
super.awakeFromNib()
self.layer.cornerRadius = 4
}

اگر بخوایم برای همین UIView یک border از پایین ایجاد کنیم، چه باید بکنیم؟

برای رسین به این هدف کاری که باید انجام بدیم اینه که یک CALayer ایجاد کنیم و رنگ border اون رو به رنگ دلخواه در بیاریم و هر بلای دیگه دوست داشتیم سرش بیاریم و دست آخر اون رو به لایه اصلی UIView خودمون اضافه کنید (بعنوان فرزند).

Objective-C


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-(void)initialise;{
//add border
UIColor * color = [UIColor grey];
CGFloat borderWidth = 2;
CALayer *border = [CALayer layer];
border.borderColor = color.CGColor;
border.frame = CGRectMake(-borderWidth, -borderWidth, self.frame.size.width+borderWidth, self.frame.size.height+borderWidth);
border.borderWidth = borderWidth;
border.cornerRadius = 4.f;
[self.layer addSublayer:border];
self.layer.masksToBounds = YES;
//round
self.layer.cornerRadius = 4.0f;
}

Swift


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
override func awakeFromNib() {
super.awakeFromNib()
// border bottom
let border = CALayer(); // if swift < 2 then use var
let borderWidth:CGFloat = 4; // if swift < 2 then use var
border.borderColor = UIColor.greyColor().CGColor;
border.frame = CGRectMake(-borderWidth, -borderWidth, self.frame.size.width+borderWidth, self.frame.size.height+borderWidth);
border.borderWidth = borderWidth;
border.cornerRadius = 4;
self.layer.addSublayer(border)
self.layer.masksToBounds = true;
// corner
self.layer.cornerRadius = 4
}

خانواده

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


به دنیا آوردن، مراقبت کردن، سیر کردن و زنده نگه داشتن رو هر جاندار دیگه‌ای هم میتونه در حق بچه خودش انجام بده

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

PHP: ذخیره تصاویر کدهای base64 بصورت فایل

وقتی سخن از فایل درکامپیوتر به میان می‌آید همه ما به یاد آیکون‌های رنگارنگ سیستم عامل خود می‌افتیم، در حالی که فایل‌ها چیزی غیر از یک دنباله از صفرها و یک‌ها نیستند، یک فایل وقتی روی هارد شما ذخیره می‌شود بصورت یک دنباله صفر و یک ذخیره می‌شود. تصاویر نیز در کامپیوتر از اینچنین هستند و یک تصویر وقتی روی هارد شما قرار دارد تنها از یک و صفر تشکیل شده است، به تصویر (فایل) عبارت دیگر بصورت یک عدد در مبنای ۲ ذخیره می‌شود. کدهای base64 نمایش محتوای یک فایل در مبنای ۶۴ هستند. ساختار زیر نمونه یک کد base64 برای یک تصویر است.
بخش نخست این کد (data:image/png;base64,) مشخص کننده نوع فایل است که در این مثال یک فایل png است. بخش دوم هم همان محتوای فایل در مبنای ۶۴ است.
هر کاراکتر در بخش دوم متناظر با یک عدد است، برای مثال کاراکتر i مترادف عدد 34 است، لیست کامل اعدداد متناظر با هرکاراکتر در انتها آورده شده است


1
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAA ....EpXLlOdmsKIRIiOjBDs7fPK+BfvMoF8B0JibwAAAABJRU5ErkJggg==

برای تبدیل دوباره این کد‌ها به فایل در PHP می‌بایست بخش اول آن که مشخص کننده نوع فایل است را حذف کرده و سپس آنها بصورت بصورت باینری درون فایل ذخیره کنیم


1
2
3
4
5
6
7
8
9
10
function writeBase64($base64_string, $output_file) {
$ifp = fopen($output_file, "wb");
$data = explode(',', $base64_string);
fwrite($ifp, base64_decode($data[1]));
fclose($ifp);
return $output_file;
}

جدول زیر نشان‌دهنده شماره هر کاراکتر در کدبندی base64 است.















































































































































































ValueChar ValueChar ValueChar ValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

لیست پروسس‌های فعال mysql

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


اگر توی حالتی گیر کردید که زمان اجرای کوئری شما تا ابد طول می‌کشه با احتمال بالایی شما باید یکی (از پروسس‌ها) رو بکشید

توی این حالته که باید دست به دامان mysqladmin بشید. اگر لیست پروسس‌های پایگاه‌داده خودتون رو ببینید متوجه میشید که اون کوئری به حالت اسلیپ باقی‌مونده


1
2
3
4
5
6
7
8
$ mysqladmin processlist -u root -p
Enter password:
+-----+------+-----------+-------------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+-------------------+---------+------+-------+------------------+
| 174 | root | localhost | example | Sleep | 297 | | |
| 407 | root | localhost | | Query | 0 | | show processlist |
+-----+------+-----------+-------------------+---------+------+-------+------------------+

و باید بکشیدش :)


1
mysqladmin -u root -p kill 174

بدون نیاز به وارد کردن پسورد به سرور خود وصل شوید

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


اگر تا بحال کلیدی برای خودتون نساختید باید یک کلید بسازید. برای اطلاع از اینکه کلید ساختید یا نه میتونید دستور ls ~/.ssh رو فراخوانی کنید، اگر فایلی بنام id_rsa وجود نداشت شما باید کلید ایجاد کنید. البته همه کلید‌های الزاما به اسم id_rsa نیستند و کلید‌های میتوانند نام‌های مختلفی داشته باشند ولی در اینجا ما میخواهیم با این اسم کار کنیم.
برای ساخت کلید تنها کافی است دستور ssh-keygen -t rsa را اجرا کنید، ابتدا نام فایل را از شما میخواهد که تنها کافی‌است Enter را بفشارید تا فایل با نام پیشفرض که مورد نظر ماست ایجاد شود، سپس رمز کلید خود را وارد کنید. خروجی دستور همانند زیر خواهد بود


1
2
3
4
5
6
7
8
9
10
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa):
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A


حال درون سرور خود باید فولدر .ssh را ایجاد کنیم


1
$ ssh user@server.address mkdir -p .ssh


تنها کار باقی مانده افزودن کلید خودمان به کلیدهای احراز شده در سرور است


1
$ cat ~/.ssh/id_rsa.pub | ssh user@server.address 'cat >> .ssh/authorized_keys'


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