داشتن چند نوع 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 فرق داره، اما این تفاوت چیزی نیست که تو شروع کار حتی متوجه‌ش بشید. برای همین لازمه با جاوا در حد متوسط آشنا باشید و بتونید برنامه‌های ساده‌ای با این زبون بنویسید. میتونید برای شروع چند تا مسئله معروف رو با این زبان حل کنید تا ببینید چقدر بهش مسلطید. حل مسئله‌هایی مثل هشت وزیر هم دید خوبی نسبت به برنامه‌نویسی جاوا میده و هم انقدر معروفه که میتونید چندین مدل پیاده‌سازی آماده‌اش رو پیدا کنید و با کدهای خودتون مقایسه کنید.این کار تاثیر معرکه‌ای روی تسلطتتون به یک زبان برنامه‌نویسی خواهد داشت.

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

۳۰ نظر

SIP Protocol | پروتکل سیپ

برای پروژه‌ای یک مقاله کوتاه در مورد SIP نوشتم. اینجا هم قرارش میدم شاید به درد کسی خورد.

تماسهای روی IP از دو دسته‌ی اصلی پروتکل تشکیل شده اند:

۱- پروتکل‌های Transmission

۲- پروتکل‌های Signaling

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

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

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

پروتکل SIP یک پروتکل لایه اپلیکیشن هست که شباهت زیادی به پروتکل HTTP دارد. بدین صورت که با ارسال پیغامهای متنی، کلاینت و سرور با هم ارتباط برقرار میکنند. پیغامهای متنی SIP از دو دسته تشکیل شده اند. درخواست ها و پاسخ ها.

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

نظر بدید

کمی در باب USB و کاربردش تو اندروید

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

اما تا به حال کنجکاو شدیم که USB چیه و چجوری کار میکنه ؟

USB یا همون Universal Serial Bus یک استاندارد جهانیه که کابل، کانکتور و پروتکلهای ارتباطی در bus، و نحوه تامین توان لازم بین کامپیوتر و سایر تجهیزات الکترونیکی رو تعریف میکنه.

US‌B طراحی شده تا یک ارتباط استاندارد بین تمام لوازم جانبی کامپیوتر مثل موس، کیبورد، دوربین، پخش کننده موسیقی، پرینتر و … ایجاد کنه. استانداردی هم برای ارتباطات متقابل و هم برای تامین انرژی این دیوایسها.

USB 2 که در آپریل سال ۲۰۰۰ معرفی شد چهار سیم داشت: دوتا برای تامین برق، و دو تا برای انتقال اطلاعات. USB 2 قابلیت انتقال ۴۸۰Mbit/s دیتا دارد.

در USB 3 که در نوامبر ۲۰۰۸ معرفی شد، تعداد سیم ها به ۹ سیم افزایش یافت. USB 3 قابلیت انتقال اطلاعات تا ۵Gbit/s دیتا دارد.

همونطور که مشخصه دستگاه های جانبی برای کار کردن نیاز به توان الکتریکی دارند و USB این توان رو تامین میکنه. در استاندارد USB ولتاژ ۵ ولت به دستگاه داده میشود و دستگاه میتواند تا ۵۰۰ میلی‌آمپر جریان بکشد. این مقدار جریان در USB3 به ۹۰۰ میلی‌آمپر افزایش یافت.

ارتباطات USB به شکل master/slave (رئیس/برده) هستند. در این سبک ارتباطات یک دستگاه (مثل لپتاپ شما) نقش master یا همون هاست رو بازی میکنه و یک دستگاه دیگه (مثل هارد دیسک اکسترنال) نقش slave رو ایفا میکنه. به این شکل که master توان الکتریکی مورد نیاز slave رو تامین میکنه و بر روی اون کنترل داره. برای مثال وقتی گوشیتون رو به لپتاپتون متصل میکنید، میتوانید با لپتاپ فایلهای گوشی رو مدیریت کنید و در عین حال لپتاپ برای گوشی ولتاژ ۵ولت فراهم میکنه که منجر به شارژ شدن گوشی میشه. اما تو این حالت از طریق گوشی هیچ کنترلی رو لپتاپ ندارید و این لپتاپه که مدیریت رو بر عهده داره. چون لپتاپ در اینجا نقش Master یا به بیان دیگری نقش هاست رو بر عهده گرفته.

اما اگر با کابلهای OTG آشنا باشید و ازشون استفاده کرده باشید، احتمالا تو پاراگراف بالا خیلی با من موافق نبودید. شما ممکنه با این کابلها کیبورد، موس، حافظه فلش و یا هر چیز دیگه‌ای رو به گوشیتون متصل کرده باشید. خب بدیهیه که وقتی مثلا حافظه فلش رو به گوشی متصل میکنید این گوشیه که نقش هاست رو به عهده میگیره. چون گوشی توان مورد نیاز برای حافظه فلش رو تامین میکنه و گوشیه که روی این حافظه کنترل داره. خب، مخالفت شما تا حدی درسته و برمیگرده به تکنولوژی‌ای که در سال ۲۰۰۱ معرفی شد.

USB On-The-Go یا USB OTG یا OTG تکنولوژی‌ای است که در سال ۲۰۰۱ به روی USB 2 تعریف شد. این تکنولوژی این امکان رو میداد که یک دیوایس هم بتونه نقش  Master و هم بتونه نقش Slave رو بازی کنه. این دقیقا همون دلیلیه که میتونید با یه کابل OTG گوشی رو تبدیل به یک USB Host کنید و مثلا بهش حافظه فلش متصل کنید.

خب حالا یه سوال: من میتونم از طریق USB گوشی دیتا رد و بدل کنم؟ اینجا منظورم از دیتا فایل نیست. منظورم مثلا دیتای سیگنالینگه. فکر کنم دارم بد توضیح میدم. اجازه بدید منظورم رو با یه مثال بگم:

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

اینجا همون جاییه که تکنولوژی OTG به کارم میاد. و خبر خوب اینکه تمام APIهای لازم برای این کار به طور پیشفرض در SDK اندروید وجود دارند. این API رو میتونید اینجا ببنید و کار باهاش رو یاد بگیرید.

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

منبع توضیحاتم در مورد USB، این لینک و این لینک از ویکی‌پدیا بود.

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