あらいまんと申します。

人生に焦るひよっこエンジニアの日記

絶望した

はじめに

「荒れてる方のあらい」改め、「あらいまん」と申します。 自分のために、ブログを再開することにしました。

自分の考えていることを文章に起こして整理したり、ただのストレス解消(書くと何だか癒される)。 あるいは、(転職など)自分の転機で利用する、僕自身の説明書として。


本題

最近、チームメンバーが勉強会に積極的に参加しているのに触発され、開発向けの勉強会に参加している。 先週日曜日は、新卒が中心に集まる勉強会に参加した。

絶望した。。。 自分が、同じような年齢の新卒に比べ、圧倒的に技術的な知識・スキルで明らかに劣っていることが分かったから。

自分はせいぜい、業務の中で使用している言語・フレームワークを利用しながら、辛うじてWebアプリを作れるくらいのレベル(オブジェクト指向原則を使いこなすなど、思慮に富んだコードを書くことに苦戦中) 一方で、他の新卒には「負荷分散をして某サイトをスクレイピング」したり、「事業のフェーズを意識しながら、最適な技術を選択」できたり、「どんな言語が好きで、なぜ好きかをハッキリ言う」ことができる人がいる。 彼らの技術的に関する雑談にも、全くついていけない。

この1年間、自分なりに懸命に仕事に取り組んできた。休日には、仕事で生まれた悩みを解決する糸口を見つけるために振り返り、本を読み、考えた。 でも、「見事に」・「気持ちイイ!!」くらい圧倒的な差を付けられていた。

頭をぶん殴られるような感覚。。。!! 「事業フェーズに合わせて、適切な言語・ライブラリを選択する」スキルは、正直あと1年後くらいに身につけば良いだろうくらいに思ってたよ。 久々に、割と本気で落ち込んだ。

とはいえ、くよくよしてばかりもいられないので、アクションを起こしてみることにする。

自分の問題(彼らとの差)は大きく2つあると思っている。

  1. どれだけコードを書いてきたか
  2. 隙間時間をどれだけ技術に関する情報収集のための時間として使ってきたか

あまりクールな答えじゃないんだけど、「コードを書くことにかけた時間」・「これまで使ったことのない技術を使って、どれだけ実装するか」が重要だと思う。 だから、オブジェクト指向言語でオリジナルアプリを作る。コードを書くことに沢山の時間を捧げる。 オブジェクト指向などを適用した「思慮に富んだコード」を書けるようになることが最優先事項だと思うので、「慣れ親しんだ技術で、十分に考えて書くこと」を大事にして。 「これまで使ったことのない技術」を使うのは、今は優先度低いから半年後くらいに。

早速、オリジナルアプリを作り始めているけど、どれだけ継続してコードを書いて、試行錯誤できるかが勝負だなーと感じている。。。

parent()・parents()・closest()の違い

お久しぶりです! Qiitaに書いた記事の転記ですが、載せまーす!

ある要素の上の階層にある要素を取得するメソッドの違いを説明します。

メソッドの概要

  • parent([selector]) : 1個上の階層の要素を取得
  • closest(selector) : セレクタに合致する、直近の階層の要素を取得
  • parents([selector]) : 上の階層の全ての要素を取得

実行してみる

ChromeDeveloperToolsなどにコピペして実際に指定してみてくださいね

<html>
<head>
  <script type="text/javascript" src="http://code.jquery.com/jquery-3.1.0.min.js"></script>
</head>
<body>
  <div id="parent-a">
    <h1>見出し</h1>
    <div id="parent-b">
      <div id="parent-c">
        <div id="child"></div>
      </div>
    </div>
  </div>
</body>
</html>
$('#child').parent(); 
  -> [<div id="parent-c">..</div>]

$('#child').closest('#parent-c'); 
  -> [<div id="parent-c">..</div>]

$('#child').parents(); 
  -> [<div id="parent-c">..</div>, <div id="parent-b">..</div>, <div id="parent-a">..</div>, <body>..</body>, ..]

parent()とclosest()の違い

  • parent() : 1個上の階層の要素しか取得できない
    • 上の例だと、$('#child')からは、parent-cしか取れない
  • closest() : 1個上とは限らず、条件に合致する最も近い階層の要素を取得できる
    • 上の例だと、$('#child').closest('parent-b')などで、親の親要素であるparent-bを取ることもできる

Android ~Activity を Fragment にする~

こんにちは。新しい方のあらいではなく、荒れてる方のあらいです。



今日は、歩数計アプリの、Main となるActivity を Fragment に直してみました。



いくつかエラーが出たので、1つ1つどのように直したのか、書こうと思います。



まずは、直す前のActivity

public class WalkMeterActivity extends Activity implements OnClickListener {
    private TextView mSensorTextView;
    private TextView mSensorTextView2;

    private Button mStartButton;
    private Button mStopButton;
    
    WalkMeterSQLiteOpenHelper db;

    
 private class WalkMeterReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction() == WalkMeterService.ACTION) {
                screenDisplay();
            }
        }
    }

    private WalkMeterService mWalkMeterService;

    private final WalkMeterReceiver mWalkMeterReceiver = new WalkMeterReceiver();

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mWalkMeterService = ((WalkMeterService.WalkMeterBinder)service).getService();
            startDisplay();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mWalkMeterService = null;
        }
    };
    
    
    //Preferenceの値
    
    private SharedPreferences preference;
    
    private Editor editor;
    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSensorTextView = (TextView)findViewById(R.id.text_sensor);
        mSensorTextView2 = (TextView)findViewById(R.id.text_sensor_distance);
        mStartButton = (Button)findViewById(R.id.button_start);
        mStopButton = (Button)findViewById(R.id.button_stop);
        mStartButton.setOnClickListener(this);
        mStopButton.setOnClickListener(this);
        
        db = new WalkMeterSQLiteOpenHelper(this);
        
        //プリファレンスの準備
        preference = getSharedPreferences("name_and_height", MODE_PRIVATE);
        editor = preference.edit();
        
      //初回起動だけの処理
        if(preference.getBoolean("Launched", false)==false){
        Intent intent = new Intent();
        intent.setClassName("com.notnewarai.walkmeter","com.notnewarai.walkmeter.FirstSetting");
        startActivity(intent);
       
        //Launchedの書き換え(2回目以降は、設定しなくてもいいように)
        editor.putBoolean("Launched", true);
        editor.commit();
       
        }
    }

    @Override
    public void onResume() {
        startService(new Intent(this, WalkMeterService.class));
        registerReceiver(mWalkMeterReceiver, new IntentFilter(WalkMeterService.ACTION));
        bindService(new Intent(this, WalkMeterService.class), mServiceConnection,
                Context.BIND_AUTO_CREATE);
        super.onResume();
    }

    public void startDisplay() {
        if (mWalkMeterService.getState()) {
            screenDisplay();
        }
    }

    public void screenDisplay() {
        mSensorTextView.setText(mWalkMeterService.getCounter() + getString(R.string.label_counter));
        
        mSensorTextView2.setText(calcDistance(mWalkMeterService.getCounter()) + getString(R.string.label_counter2));
        
        /* getHistoryStepsがうまくいかないので、コメントアウト
        if(calcDistance(mWalkMeterService.getCounter()+db.getAllHistorySteps()) >= 2400 ){
       
       
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("ゴール!!")
        .setMessage("おめでとうー。")
        .show();
        }
        
        */
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        db.close();
        unbindService(mServiceConnection); 
        unregisterReceiver(mWalkMeterReceiver);
        if (!mWalkMeterService.getState())
            mWalkMeterService.stopSelf();

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_start:
                if (mWalkMeterService.getState())
                    return;
                mWalkMeterService.startCount();
                break;
        case R.id.button_stop:
                if (!mWalkMeterService.getState())
                    return;
                mWalkMeterService.stopCount();
                break;
        }
    }
    
    
    public double calcDistance(int counter){
   
    double km_distance = counter * getHeight(this) * 0.45 / 100000;
   
    BigDecimal bd_km_distance = new BigDecimal(km_distance);
   
    BigDecimal down_bd_km_distance = bd_km_distance.setScale(1, BigDecimal.ROUND_DOWN);
   
    double distance = down_bd_km_distance.doubleValue();
   
    return distance;
    }
    
    public int getHeight(Context context){
    SharedPreferences pref = context.getSharedPreferences( "name_and_height", Context.MODE_PRIVATE );
   
    String strHeight = pref.getString("user_height", "-1");
   
    return Integer.parseInt(strHeight);
    }
    
}




エラー


  • setContentView(R.layout.main);
  • findViewByIdの箇所
  • db = new WalkMeterSQLiteOpenHelper(this); のような、this など Contextを使っている箇所
  • Preference
  • startService(new Intent(this, WalkMeterService.class)); のような、サービスに関係する箇所




先に、直し終えたFragmentのコードです。



public class WalkMeterFragment extends Fragment implements OnClickListener {
    private TextView mSensorTextView;
    private TextView mSensorTextView2;

    private Button mStartButton;
    private Button mStopButton;
    
    WalkMeterSQLiteOpenHelper db;

    
 private class WalkMeterReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction() == WalkMeterService.ACTION) {
                screenDisplay();
            }
        }
    }

    private WalkMeterService mWalkMeterService;

    private final WalkMeterReceiver mWalkMeterReceiver = new WalkMeterReceiver();

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mWalkMeterService = ((WalkMeterService.WalkMeterBinder)service).getService();
            startDisplay();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mWalkMeterService = null;
        }
    };
    
    
    //Preferenceの値
    
    private SharedPreferences preference;
    
    private Editor editor;
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        
        View view =inflater.inflate(R.layout.walkmeterfragment, container, false);
        
        mSensorTextView = (TextView)view.findViewById(R.id.text_sensor);
        mSensorTextView2 = (TextView)view.findViewById(R.id.text_sensor_distance);
        mStartButton = (Button)view.findViewById(R.id.button_start);
        mStopButton = (Button)view.findViewById(R.id.button_stop);
        mStartButton.setOnClickListener(this);
        mStopButton.setOnClickListener(this);
        
        
        return view;
    }
    
    @Override
    public void onAttach(Activity act){
        super.onAttach(act);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        
        
        
        db = new WalkMeterSQLiteOpenHelper((MainActivity)getActivity()); 
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);
     
      
    }

    @Override
    public void onResume() {
        getActivity().startService(new Intent(getActivity(), WalkMeterService.class));
        getActivity().registerReceiver(mWalkMeterReceiver, new IntentFilter(WalkMeterService.ACTION));
        getActivity().bindService(new Intent(getActivity(), WalkMeterService.class), mServiceConnection,
                Context.BIND_AUTO_CREATE);
        super.onResume();
    }

    public void startDisplay() {
            if (mWalkMeterService.getState()) {
            screenDisplay();
        }
    }

    public void screenDisplay() {
        mSensorTextView.setText(mWalkMeterService.getCounter() + getString(R.string.label_counter));
        
        mSensorTextView2.setText(calcDistance(mWalkMeterService.getCounter()) + getString(R.string.label_counter2));
        
        
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        db.close();
        getActivity().unbindService(mServiceConnection); 
        getActivity().unregisterReceiver(mWalkMeterReceiver);
        if (!mWalkMeterService.getState())
            mWalkMeterService.stopSelf();

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_start:
                if (mWalkMeterService.getState())
                    return;
                mWalkMeterService.startCount();
                break;
        case R.id.button_stop:
                if (!mWalkMeterService.getState())
                    return;
                mWalkMeterService.stopCount();
                break;
        }
    }
    
    
    public double calcDistance(int counter){
        
        
        

        
        
        double km_distance = counter * getHeight((MainActivity)getActivity()) * 0.45 / 100000;
        
        BigDecimal bd_km_distance = new BigDecimal(km_distance);
        
        BigDecimal down_bd_km_distance = bd_km_distance.setScale(1, BigDecimal.ROUND_DOWN);
        
        double distance = down_bd_km_distance.doubleValue();
        
        return distance;
    }
    
    public int getHeight(Context context){
        SharedPreferences pref = context.getSharedPreferences( "name_and_height", Context.MODE_PRIVATE );
        
        String strHeight = pref.getString("user_height", "-1");
        
        return Integer.parseInt(strHeight);
    }
    
}




どのように変更したか


  • setContentView → onCreateViewメソッドを作成
  • findViewById → view.findViewById にする
  • db = new WalkMeterSQLiteOpenHelper(this); のthis → getActivity() にする 
  • Preference → Fragmentから消し去り、Tabを管理する MainActivity の onCreate に移す
  • startService(new Intent(this, WalkMeterService.class)); → getActivity().startService ・・・ のように先頭にgetActivity()をつける




以上、AcitivityをFragment に直す際に出たエラーと、解決策でした!



ありがとうございました。また今度!





(最近、運動にハマってきました・・・。目指せ逆三角形!ww)