۹ مهارت نرمی که برای موفقیت در رشته نرم‌افزار به آن نیاز دارید

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

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

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

در هر شغل و حرفه گروهی از مهارت‌های تخصصی وجود دارد که فرد متخصص لازم است آن‌ها را فرا بگیرد (مثلا: یک جوشکار باید جوشکاری با گاز آرگون را بلد باشد!) اما گروهی از مهارت‌ها هم وجود دارند که در هر شغلی و از آن‌ مهم‌تر در زندگی روزمره برای ما کاربرد دارند. این مهارت‌ها مهارت‌های عمومی شغل و زندگی محسوب می‌شوند. مهارت‌های دسته‌ی اول را مهارت‌های سخت و مهارت‌های دسته‌ی دوم را مهارت‌های نرم می‌نامند.

و در مطلبی دیگه، ۲۱  مهارت نرم رو لیست میکنه. من در این نوشته قصد دارم به ۹ مهارت نرمی اشاره کنم که شما برای موفقیت تو رشته نرم‌افزار بهشون نیاز دارید.

ادامه این نوشته

۱۳ نظر

تغییر فونت کل اپلکیشن اندروید به طور یکجا

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

ابتدا یه کلاس به اسم FontsOverride بسازید و دقیقا به شکل زیر بنویسیدش:

import java.lang.reflect.Field;
import android.content.Context;
import android.graphics.Typeface;

public final class FontsOverride {

    public static void setDefaultFont(Context context,
            String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(),
                fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    protected static void replaceFont(String staticTypefaceFieldName,
            final Typeface newTypeface) {
        try {
            final Field staticField = Typeface.class
                    .getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

 

 

حالا یه کلاس به اسم اسم اپلیکیشن میسازیم و به شکل زیر مینویسیم:

public final class Application extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    }
}

 

 

کار اصلی‌ای که در این کلاس انجام میدیم اینه که فونت رو برای چهار حالت default , monospace , serif , sans_serif تایید میکنیم. دقت کنید که هر کدوم از فونت‌هایی که تو این کلاس اسمشون رو نوشتیم باید دقیقا با همین اسم داخل فولدر assets وجود داشته باشه.

حالا داخل تگ application در manifest باید به android:name اسم کلاس Applicationی که نوشتم رو بدیم. برای مثال من که این کلاس رو داخل پکیج utils نوشتم این ویزگی رو به این شکل تغییر میدم:

<application
        android:name=".utils.Application"
        .
        .
        .
        .
        >

 

خب به آخرش رسیدیم. حالا تنها کاری که باید بکنیم اینه که تو styles مشخص کنیم که میخوایم از کدوم فونت استفاده کنیم. برای مثال من میخوام که اپلیکیشنم از فونت monospace استفاده کنه:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        
        <item name="android:typeface">monospace</item>
    </style>

 

خب به انتهای کار رسیدیم. از تعییر فونت به همین سادگی لذت ببرید.

در اندروید ۵.۰ (API 21) ممکنه که کمی مشکل داشته باشید. مشکل به این خاطره که این روش با تم android:Theme.Material.Light سازگار نیست. برای حل این مشکل از تم قبلی استفاده کنید:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
   <item name="android:typeface">monospace</item>
</style>

البته در اندروید ۵.۱ این مشکل هم حل شد و این روش بدون نیاز به تغییر تم کار خواهد کرد.

۱۱ نظر

داشتن چند نوع view در RecyclerView

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

کار دیگه‌ای که RecyclerView انجامش رو برامون حسابی راحت کرده، داشتن چند مدل view مختلف در داخل یک لیسته. قبلا این کار ساده نبود و انجامش گاهی پرفورمنس رو حسابی پایین میاورد. اما الان با RecyclerView زندگی کمی بهتر شده.

ترجیح میدم به جای اینکه توضیحات فارسی بدم،‌ مستقیما کد رو بنویسم و تا شما با خوندن کد،‌ متوجه مکانیزم کار بشید. کد زیر رو ببینید:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

      @Override
    public int getItemViewType(int position) {
        return position%2;
    }

   
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        if (viewType == 0) {
            View view = LayoutInflater.from(activity).inflate(R.layout.first_view, parent, false);
            return new FirstViewHolder(view);
        } else {
            View view = LayoutInflater.from(activity).inflate(R.layout.second_view, parent, false);
            return new SecondViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof FirstViewHolder) {
            .
            .
            .

        } else {
            .
            .
            .

        }

    }


    @Override
    public int getItemCount() {
        return ... ;
    }


    public class FirstViewHolder extends RecyclerView.ViewHolder {
       

        public FirstViewHolder(View view) {
            super(view);
            
        }
    }

    public class SecondViewHolder extends RecyclerView.ViewHolder {
        public SecondViewHolder(View view) {
            super(view);
        }
    }
}

حالا توضیحات مختصری در مورد متدهای این کلاس میدم:

public int getItemViewType(int position)

این متد برای مایی که میخوایم چند نوع view داشته باشیم اصلی‌ترین کار رو انجام میده. تو این متد میتونیم با محاسباتی که روی position انجام میدیم یک مقدار برگردونیم. این مقدار بعدا به ما کمک میکنه که تصمیم بگیریم کدوم view رو نمایش بدیم. کاری که من کردم اینه که باقی مونده تقسیم position به ۲ رو برمیگردونم تا بر اساس مقدار view دلخواهم رو نشون بدم.

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 

این متد مقداری که متد قبلی برگردونده رو به اسم viewType در ورودی میگیره. من تو کلاس بالا چک میکنم و بر اساس اینکه این مقدار صفره یا یک، view دلخواهم رو inflate میکنم و ViewHolder دلخواهم رو برمیگردونم.

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)

ViewHolderی که تو متد قبلی برگردوندم اینجا به عنوان ورودی میگیرم. کار اصلی‌ای که تو این متد انجام میشه اینه که ظاهر view رو کامل میکنم. مثلا اگر view من قراره که یه TextView داشته باشه، اون رو در این متد setText میکنم.

public int getItemCount()

این رو هم که هممون میشناسیم. میگه که قراره این لیست چند تا view داشته باشه.

public class FirstViewHolder extends RecyclerView.ViewHolder

public class SecondViewHolder extends RecyclerView.ViewHolder

این دوتا هم که ViewHolderهای ما هستند. یکی برای viewهای فرد و دیگری برای viewهای زوج.

سعی کردم تا حد ممکن خلاصه توضیح بدم. اما اگر سوالی بود در کامنت‌ها بپرسید. حتما جواب خواهم داد.

 

۳ نظر

معرفی کتابخانه آزاد image-chooser-library برای اندروید

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

یکی از این کارای تکراری نوشتن یه ImagePicker است. منظورم چیه؟ فرض کنید شما داخل اپلیکیشن اندرویدیتون یک صفحه‌ی کاربری دارید و به کاربر این امکان رو میدید که اونجا برای خودش عکس پروفایل انتخاب کنه. کاری که باید بکنید اینه که یک Intent بزنید و بعد از اینکه کاربر عکس رو انتخاب کرد ازش thumbnail بسازید و احتمالا با مشکلات و تفاوتهای اندرویدها مختلف تو آدرس دهی دادن به فایل‌ها سر و کله بزنید.

اما من امروز میخوام بهتون یه راه دوم رو معرفی کنم. راهی که یک کتابخونه به اسم  image-chooser-library بر سر راه ما قرار داده.

روش استفاده

برای استفاده از این کتابخونه خط زیر رو به dependencyهای Gradle اضافه کنید:

compile 'com.kbeanie:image-chooser-library:1.4.4@aar'

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

imageChooserManager = new ImageChooserManager(this, ChooserType.REQUEST_PICK_PICTURE);
imageChooserManager.setImageChooserListener(this);
imageChooserManager.choose();

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

imageChooserManager = new ImageChooserManager(this, ChooserType.REQUEST_CAPTURE_PICTURE);
imageChooserManager.setImageChooserListener(this);
imageChooserManager.choose();

متد Activity Result رو هم باید به شیوه زیر بنویسید‌:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK &&
(requestCode == ChooserType.REQUEST_PICK_PICTURE||
requestCode == ChooserType.REQUEST_CAPTURE_PICTURE)) {
imageChooserManager.submit(requestCode, data);
}
}

همچنین باید این listener را implement کنید و در متد‌های اون تعیین کنید که پس از انتخاب عکس چه اتفاقی رخ بدهد:

 

@Override
public void onImageChosen(final ChosenImage image) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (image != null) {
// Use the image
// image.getFilePathOriginal();
// image.getFileThumbnail();
// image.getFileThumbnailSmall();
}
}
});
}
@Override
public void onError(final String reason) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// Show error message
}
});
}

دقت کنید که باید permission زیر رو هم به manifest اضافه کنید:‌

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

۴ نظر

معرفی دو ORM برای استفاده در برنامه‌نویسی اندروید

اگر برنامه نویس اندروید هستید، احتمالا نیاز خواهید داشت که داده ها رو در دیتابیس ذخیره کنید. برای اینکار ممکنه از یک سرویس ابری استفاده کنید یا اینکه داده‌ها رو تو خود دیتابیس اپلیکیشن (احتمالا SQLite) و داخل خود گوشی ذخیره کنید. اگر راه‌کار دوم رو انتخاب کنید باید یا کوئریهای دیتابیس رو خودتون بنویسید یا از یک ORM استفاده کنید.

ORM که مخفف Object Relational Mapping است، در علم کامپیوتر به معنای تکنیکی است که دو نوع داده‌ای متفاوت رو (نوع Object و نوع داده‌ای موجود تو Relational Databaseها) به هم تبدیل میکنه. اینجا وقتی ما از ORM حرف میزنیم منظور کتابخونه‌ایه که این کار رو برای ما انجام میده. من در اینجا قصد دارم دوتا کتابخونه ORM که تو اندروید استفاده میشه رو معرفی کنم.

OrmLite

OrmLite مخصوص اندروید نیست، اما چون با جاوا نوشته شده هر جایی که جاوا باشه این هم قابل استفاده‌ست. جاهایی مثل اندروید، کانکشن‌های JDBC و فریم‌ورک Spring.

یک نمونه کلاس User که با این ORM نوشته بشه به شکل زیره:

 

@DatabaseTable(tableName = "users")
public class User {
    @DatabaseField(id = true)
    private String username;
    @DatabaseField
    private String password;

    public User() {
        // ORMLite needs a no-arg constructor
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    // Implementing getter and setter methods
    public String getUserame() {
        return this.username;
    }
    public void setName(String username) {
        this.username = username;
    }
    public String getPassword() {
        return this.password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

 

OrmLite متن بازه و میتونید کدش رو از این لینک گیت‌هاب ببینید.

SugarORM

SugarORM فقط مخصوص اندروید نوشته شده و نحوه‌ی استفاده ازش ساده‌ست. خودش جدولهای مورد نیازتون رو میسازه و برای ایجاد انواع Relationship  متدهای ساده‌ای رو در اختیار شما قرار میده. این کتابخونه عملیات CRUD رو با سه متد زیر انجام میده:  delete() , save() , find() .

برای اینکه از این کتابخونه استفاده کنید باید این چهار meta-data رو به manifest اضافه کنید:

<meta-data android:name="DATABASE" android:value="my_database.db" />
<meta-data android:name="VERSION" android:value="1" />
<meta-data android:name="QUERY_LOG" android:value="true" />
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.my-domain" />

حالا میتونید یه کلاس User رو به شکل زیر بسازید:

public class User extends SugarRecord<User> {
    String username;
    String password;
    int age;
    @Ignore
    String bio; //this will be ignored by SugarORM

    public User() { }

    public User(String username, String password,int age){
        this.username = username;
        this.password = password;
        this.age = age;
    }
}

 

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

User johndoe = new User(getContext(),"john.doe","secret",19);
johndoe.save(); //stores the new user into the database

 

یا تمام کاربرانی که سنشون ۱۹ است رو پاک کنید:

List<User> nineteens = User.find(User.class,"age = ?",new int[]{19});
foreach(user in nineteens) {
    user.delete();
}

 

برای توضیحات بیشتر، داکیومنت SugarORM  رو از اینجا بخونید.

راستی برای اضافه کردن SugarORM  به پروژه تنها کافیه خط زیر رو به dependencyهای Gradle اضافه کنید:

compile 'com.github.satyan:sugar:1.3'

 

 

۳ نظر

نوشتن اپلیکیشن اندرویدی بارکدخوان

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

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

برای شروع باید با اضافه کردن خط زیر به dependency های Gradle، کتابخونه مورد نظرمون رو از ریپازیتوریهای maven دانلود کنیم:

dependencies {
    compile 'me.dm7.barcodescanner:zxing:1.8.2'
}

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

public class SimpleScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
    private ZXingScannerView mScannerView;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        mScannerView = new ZXingScannerView(this);   // Programmatically initialize the scanner view
        setContentView(mScannerView);                // Set the scanner view as the content view
    }

    @Override
    public void onResume() {
        super.onResume();
        mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
        mScannerView.startCamera();          // Start camera on resume
    }

    @Override
    public void onPause() {
        super.onPause();
        mScannerView.stopCamera();           // Stop camera on pause
    }

    @Override
    public void handleResult(Result rawResult) {
        // Do something with the result here
        Log.v(TAG, rawResult.getText()); // Prints scan results
        Log.v(TAG, rawResult.getBarcodeFormat().toString()); // Prints the scan format (qrcode, pdf417 etc.)
    }
}

متد handleResult اون متدیه که شما باید توش تصمیم بگیرید که با چیزی که از بارکد خوندید چیکار کنید.

بعضی از متدهای به درد بخور کلاس ZXingScannerView  عبارتند از:

// Toggle flash:
void setFlash(boolean);

// Toogle autofocus:
void setAutoFocus(boolean);

// Specify interested barcode formats:
void setFormats(List<BarcodeFormat> formats);

// Specify the cameraId to start with:
void startCamera(int cameraId);

دقت کنید که باید permission زیر رو به manifest اضافه کرده باشید‌:

<uses-permission android:name="android.permission.CAMERA" />

منبع: این پروژه در گیت‌هاب

یک نظر

در باب اهمیت رسم mockup

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

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

mockup

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

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

من خودم مدتیه که با balsamiq mockup آشنا شدم و ازش استفاده میکنم. بالزامیک بهتون این امکان رو میده که به سادگی هر چیزی که تو ذهنتنونه رو پیاده سازی کنید و خودش ابزار خوبی برای نمایش نهایی ایده‌تون در اختیارتون میذاره. هم خودش مجموعه‌ای از آیکونهای پیشفرض داره و هم میتونید خودتون هر عکس و آیکونی که خواستید رو تحت عنوان asset بهش اضافه کنید. برای مثال من اولین کاری که کردم این بود که عکس یه نکسوس۵ رو بهش اضافه کردم تا بتونم mockup هایی که برای پروژه‌های اندروید رسم میکنم رو داخل کار نکسوس۵ بکشم. بالزامیک هم برای ویندوز و هم برای مک وجود داره و میتونید نسخه trialش رو از سایت خودش دانلود کنید.

امیدوارم که تونسته باشم تو این نوشته کوتاه اهمیت استفاده از mockup رو توضیح داده باشم. چیزی که مهمه اینه که فراموش نکنیم که mockup هم در نهایت یک ابزاره برای اینکه بتونیم کار رو راحتتر کنیم. نه یه چیزی که خودش بخواد وقت اضافه‌تری از ما بگیره.

۷ نظر

ملاحظات مهمی که تو طراحی RESTful API باید در نظر بگیریم

این مقاله اولین نوشته‌ی ترجمه‌ی شده‌ایه که تو این وبلاگ منتشر میکنم. میتونید اصل مقاله رو اینجا ببینید.

وقتی داریم یک RESTful API مینویسیم بهتره که URL ها چجوری باشه؟ در URL از اسمهای جمع استفاده کنیم یا مفرد؟ برای یک ریسورس چند تا URL نیاز داریم؟ برای هر URL بهتره که از کدوم متد HTTP برای ساخت ریسورس جدید استفاده کنیم؟ URLهای عملیاتهایی که به هیج ریسورسی نیاز ندارند چطور؟ چگونه باشند؟ بهترین روش برای ورژن بندی کردن API چیه؟ اینها سوالاتی هستند که تلاش میکنیم تو این مقاله بهشون پاسخ بدیم.

برای هر نوع داده‌ای دو URL داشته باشید:

یکی برای نمایش تمام داده ها یکی برای نمایش یک داده مشخص:

 

/employees         #collection URL
/employees/56      #element URL

 

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

اینکار باعث میشود که API شما سادگی‌اش را حفظ کند و تعداد URLها کاهش بابد. برای مثال اینکار رو نکنید:

/getAllEmployees
/getAllExternalEmployees
/createEmployee
/updateEmployee

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

GET /employees
GET /employees?state=external
POST /employees
PUT /employees/56

از URLهای برای این استفاده کنید که مشخص کنید روی کدام داده میخواهید کار کنید و از متدهای HTTP برای مشخص کردن کاری که میخواهید بکنید استفاده کنید. با چهار متد GET, POST, PUT, DELETE میتوانید چهار عمل CRUD را انجام دهید (Create , Read, Update, Delete) :

  • خواندن (Read) : برای خواندن داده‌ها از GET  استفاده کنید.
  • ساختن (Create) : برای ساختن داده جدید از متد POST استفاده کنید.
  • به روز رسانی (Update) : برای به روز رسانی داده از متد PUT استفاده کنید.
  • پاک کردن (Delete) : برای پاک کردن دادهها از متد Delete استفاده کنید.

دو URL به همراه چهار متد HTTP یک سری قابلیت کامل به ما میدهند. به جدول زیر نگاه کنید:

post231_table1

از اسمهای جمع استفاده کنید:

ادامه این نوشته

۴ نظر

فارسی را در وبلاگمان درست بنویسیم

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

farsi

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

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

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

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

این مشکل توی نوشته‌های طولانی بیشتر به وجود میاد و تنها راه برطرف کردن‌اش، خوندن دوباره متنه.

ادامه این نوشته

۲۰ نظر

چجوری برنامه‌نویسی اندروید یاد بگیریم

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

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

۱- اول ببنید کجای کار ایستاده‌اید

خودشناسی قدم اول شروع هر کاریه. برای اینکه بخواید برنامه‌نویسی اندروید یاد بگیرید قبل از هرچیزی باید ببینید کجای کار ایستاده‌اید و چقدر بلدید. آیا قبلا با زبونهایی مثل C,C++, Java برنامه‌نویسی کردید؟ اگر جوابتون آره‌ست در چه سطحی؟ چقدر با الگوریتمهای مختلف آشنایید؟

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

۲- چقدر JAVA بلدید؟

اگر بخواید برای اندروید برنامه‌نویسی کنید باید آشنایی خوبی با این زبون داشته باشید. البته روشهای دیگه‌ای هم برای برنامه‌نویسی اندروید وجود داره. مثل روشهای هایبریدی در اون میتونید با جاوا‌اسکریپت و تکنولوژی‌های وب برنامه‌ای بنویسید و برای همه‌ی پلتفرم‌های موبایل خروجی بگیرید. یا xamarin که اجازه میده با C# برای اندروید برنامه‌نویسی کنید. اما همه‌ی این روش‌ها مشکلات خودشون رو دارند و چیزی که گوگل توصیه کرده همین استفاده از جاوا به همراه کتابخونه‌هاییه که خود گوگل برای اینکار ارائه داده.

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

ادامه این نوشته

۳۰ نظر
android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین