Rails チュートリアル 終わったぁ。
こんにちは。だいぶおひさしぶりにブログを書いております。
※文章作成下手くそですが、よければ最後までみてください。
僕の自己紹介をすると大学卒業後にプログラミングに興味を持って就職活動やめて、エンジニア目指して勉強してる24歳のフリーターです。
プログラミングを始めた頃はAndroidサンプルアプリを独学で作ってました。
11月頭にRails チュートリアル完走致しました。いやー、長かった。
本当に、、、
サボったりもしてました。。。
他にバイトや英語勉強などやって放ったらかしな状態の時期もありまして5、6ヶ月ぐらい掛かってしまいました。(Excuse...
一章から最後まで終わった感想としては
未経験者にとってはものすごくわかりやすくプログラミングを始める準備から、
開発の知識も得られるのでとてもいい教材だと思います。
わからない事があってもググれば出てくるのでググる癖も付けれるかと思います。
正直なところ、最初にAndroid開発に手を出したのを後悔してます。とてつもない時間を費やしてしまいました。
Android Studioでは、一切ターミナルを使わない、テストを書かないって感じでした。(当時、知識ゼロで沼にハマった気分でした。
Javaは初学者には難しいとはこの事なのかと思い知らされました。
対照的に、Railsチュートリアルでターミナルを触った時は感動でした。この気持ちわかってくれる人いるかな?
git push した時はほんと感動しました。
テストの書き方は最初訳がわからなくて最初は難しいと思いましたが、
Androidサンプルアプリを作った時より、楽しくコードを書いたり理解しやすいと思いました。
強いて言えば、cookie,アカウントの有効化、辺りが難しいなと感じました。
テストをどこに書けばいいのか困惑する事も、、(やっぱりテスト書くの難しい。
正直、文字が多くて萎える時もありましたけど、これから始める方、Progateやり終わった方に大変おすすめだと思います。
これからもRailsで開発もしていきますし、Reactも興味あるので引き続き開発、勉強に精進していきたいと思います。
やっと完走したので僕が今作りたいサービスやモノを作って就職活動したいと思います。
それでわっ!!
Webサービス開発の誘惑(振り返り)
こんちは。
プログラミング勉強を振り返り。
最初はAndroidサンプル本を買って永遠サンプルコードを書いてました。
正直、完成しても全く意味がわからなかった。メソッドの説明見ても意味がわからなかった。それに多くの時間を費やした。
やり終わった後にRetrofitを使いApiサービスを利用した飯アプリをサンプル(勉強がてら)開発した。これに更にものすごく時間がかかった。
この期間にものすごく挫折や未熟さを感じました。
ただ飯アプリの場合は自分で思い通りに完成は出来たし、コードが理解できるようになった。サンプル本と比べて大いに収穫や学んだことが大きかったと思います。
ほんと、IntentからFragmentに変えるだけでもエラーの出まくりでWaste time.
RecyclerView、ClickListenerを実装するだけでもWaste time.
ニートでお金がないから朝から晩までバイトでWaste time
みたいな勉強始めからの一年でした。
もっとガシガシとコードを書けば半年ぐらいで出来たのかな。
切り替えて今年はプログラミングに時間を捧げます。
現在は、Android開発を一段楽終え、模索中です。
模索中というか、作りたいものがない感じです。
今は、Webサービス開発の誘惑にかられていてRailsを勉強し始めているところです。
とゆうのも、Twitterで僕がフォローさしてもらっている方々がRailsを使ってサービスなど面白いことをしているからです。後は、Railsは直感的で楽しいと聞いたことがあるからです。
プログラミングを始めるならRailsがオススメらしいです。Javaは苦労するらしいです。
僕はAndroidアプリを作って自分の手で触って動かして見たいと思ったからJavaから始めたんですけどね(結果、Javaで苦しい思いと多くの時間を費やしました)。
とりあえず行動してサービス作って見たいと思います。
今年にはエンジニアとして就職したい。本場のコードに触れたい。
みたいな感じで今回は箇条書きな感じで今の思いを書いて見ました。
では!!
RecyclervView/ClickListener/Retrofit2実装した。
前回に引き続きClick機能をつけたもの作りました。
コードはこちら
Interface class
public interface OnItemClickListener{ void onItemClick(View view, int position); }
RecyclerView Adapter class
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private List<Shop> resultData; private Context mContext; private int rowLayout; private OnItemClickListener mClickListener; public CustomAdapter(List<Shop> resultData, int rowLayout, Context context) { this.resultData = resultData; this.rowLayout = rowLayout; this.mContext = context; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(rowLayout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder viewholder, final int position) { viewholder.item_text.setText(resultData.get(position).getName()); Picasso.with(mContext).load(resultData.get(position).getPhoto().getMobile().getS()) .into(viewholder.item_pic); } @Override public int getItemCount() { return resultData.size(); } public void setmClickListener(OnItemClickListener mClickListener) { this.mClickListener = mClickListener; } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ private TextView item_text; private ImageView item_pic; public ViewHolder(View itemView) { super(itemView); item_text = (TextView)itemView.findViewById(R.id.item_text); item_pic = (ImageView)itemView.findViewById(R.id.item_pic); itemView.setOnClickListener(this); } @Override public void onClick(View v) { mClickListener.onItemClick(v, getAdapterPosition()); } } }
MainFragment class
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); rManager = new InternetManager(); getGourmetData(); mRecyclerView = (RecyclerView)view.findViewById(R.id.recycleView); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.activity_main_fragment, container, false); } private void bindViews() { mRecyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(layoutManager); adapter = new CustomAdapter(shops, R.layout.activity_custom_items, getActivity()); mRecyclerView.setAdapter(adapter); adapter.setmClickListener(new OnItemClickListener() { @Override public void onItemClick(View view, int position) { DetailActivity detailFragment = new DetailActivity(); Shop shopInfo = shops.get(position); Bundle bundle = new Bundle(); bundle.putString("title", shopInfo.getName()); bundle.putString("address", shopInfo.getAddress()); bundle.putString("catches", shopInfo.getCatch()); bundle.putString("access", shopInfo.getAccess()); bundle.putString("open", shopInfo.getOpen()); bundle.putString("close", shopInfo.getClose()); bundle.putString("wifi", shopInfo.getWifi()); bundle.putString("private", shopInfo.getPrivateRoom()); bundle.putString("card", shopInfo.getCard()); bundle.putString("about", shopInfo.getOtherMemo()); bundle.putString("budget", shopInfo.getBudget().getAverage()); bundle.putString("photo", shopInfo.getPhoto().getMobile().getL()); bundle.putString("url", shopInfo.getUrls().getMobile()); detailFragment.setArguments(bundle); FragmentManager fragmentManager = getActivity().getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.activity_main, detailFragment); transaction.addToBackStack(null); transaction.commit(); } }); } private void getGourmetData(){ String shinsaibashiCode = "Y315"; String json = "json"; final Call<ShopData> requestData = rManager.getApiInterface().getShopData("APIキー", shinsaibashiCode, json); requestData.enqueue(new Callback<ShopData>() { @Override public void onResponse(Call<ShopData> call, Response<ShopData> response) { shopList = response.body().results.getShop(); shops = shopList; bindViews(); } @Override public void onFailure(Call<ShopData> call, Throwable t) { Log.e("Restaurants","Error" + t.getMessage()); Toast.makeText(getActivity().getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show(); } }); }
みたいな感じです。
ただRunするとRecyclerView: No adapter attached; skipping layoutと表示されるのでなぜかはわからない
とりあえず思った通りに形にすることができた。
サービスを何で作ったらいいのか迷ってる。Androidサーバーはみんな何使ってるの?
Web系も触りたいが、、早くエンジニアとして働いてサービス開発したい。
ついでにこのアプリのGitHubも載せておきます。
ではまた!!
RecyclervView実装してみた。
お久しぶりです。最近、以前に作ったアプリを改良してListViewからRecyclerViewに変えようとしていました。
しかし、、なかなかうまくいかなかった。
RunしてもNull Exception Java.util.listやら、 Interfaceのクリック機能がおかしいないなど、、
しかし!!!!
ようやく思った通りにできました。ほんとに時間かかった。
一応、初コード載せに挑戦してみます。
requestData.enqueue(new Callback<ShopData>() { @Override public void onResponse(Call<ShopData> call, Response<ShopData> response) { List<Shop> shopList = response.body().results.getShop(); adapter = new CustomAdapter(shopList, R.layout.activity_custom_items, getActivity()); mRecyclerView.setAdapter(adapter); } @Override public void onFailure(Call<ShopData> call, Throwable t) { Log.e("Restaurants","Error" + t.getMessage()); Toast.makeText(getActivity().getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show(); }
RecyclerView
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private List<Shop> resultData; private Context mContext; private int rowLayout; private OnItemClickListener mClickListener; public void setClickListener(OnItemClickListener clickListener) { this.mClickListener = clickListener; } public CustomAdapter(List<Shop> resultData, int rowLayout, Context context) { this.resultData = resultData; this.rowLayout = rowLayout; this.mContext = context; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(rowLayout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder viewholder, final int position) { viewholder.item_text.setText(resultData.get(position).getName()); Picasso.with(mContext).load(resultData.get(position).getPhoto().getMobile().getS()) .into(viewholder.item_pic); } @Override public int getItemCount() { return resultData.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ private TextView item_text; private ImageView item_pic; public ViewHolder(View itemView) { super(itemView); item_text = (TextView)itemView.findViewById(R.id.item_text); item_pic = (ImageView)itemView.findViewById(R.id.item_pic); } } }
こんな感じです。
使ってみた感想は、ListView覚えるよりこっち覚えたほうがいいかもねと思いました。
あとはクリック処理がうまく機能してくれるように実装頑張ります。
サンプルアプリは完成仕掛けとして、web系触るべきか、kotolinで同じようなもの作るか
考え中です、、、。
サービス作ってみたいんだけど、大学卒業して独学でプログラミング勉強して
もう3月だしできればエンジニアとして就職活動したいけど、このスキルでいけるのか、、
とりあえず頑張ります。
コードレビューを定期的に受けれる場所に行きたい
久しく投稿!!
お久しぶりです。本当におひさです。
最近はバイトしたり、釣り動画見たりしてました。
以前からブログにリンクを載せている「飯アプリ」の開発も行なってました。
以前はNavigationDrawer実装して、
今回はFragmentの実装などなど、いじってました。
以前も書いたと思うが、Fragmentの使い方が全然わからなかった、、(今思えば簡単だった、、。)今ではFragmentは主流だと思うが、、、
Intentがいらないのは画期的でスルスル動く感じがすごいとFragmentを使ってみて思った。
だいぶ前と比べてデザインが変わって使いやすくなったかな。
インターンも落ちてこれからどうしよか、、
前を向いて突き進もう!!
開発したプログラムのリンクもついでに載せときます
みてね!!