いろいろ備忘録

雑記です。

インテント先のアクティビティにstart(Object data)を実装することのメリット

AアクティビティからBアクティビティにインテントする際、

AアクティビティではなくBアクティビティのstaticメソッドでIntentを生成すると、

putExtra()のキーが散らからない。

public static void start(Context context, String fullRepositoryName) {
final Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra(EXTRA_FULL_REPOSITORY_NAME, fullRepositoryName);
context.startActivity(intent);
}

フラグメントのコメントの訳

package com.example.apitestapp;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


/**
* このフラグメントを内包するアクティビティはインタラクションイベントを受け取るために
* BlankFragment.OnFragmentInteractionListenerを実装する必要あり
* このフラグメントのインスタンスを生成するにはBlankFragment#newInstanceを使用する
*/
public class BlankFragment extends Fragment {

private OnFragmentInteractionListener mListener;

public BlankFragment () {
// リフレクションされるため必要
}

public static BlankFragment getInstance () {
return new BlankFragment ();
}

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

@Override
public View onCreateView ( LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState ) {
// Inflate the layout for this fragment
return inflater.inflate ( R.layout.fragment_blank, container, false );
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed ( Uri uri ) {
if ( mListener != null ) {
mListener.onFragmentInteraction ( uri );
}
}

//アクティビティによる利用が始まったとき実行される
@Override
public void onAttach ( Context context ) {
super.onAttach ( context );
//利用元アクティビティがインタラクションリスナを実装しているとき
if ( context instanceof OnFragmentInteractionListener ) {
//アクティビティをリスナとしてメンバ変数に設定
mListener = (OnFragmentInteractionListener) context;
} else {
//例外を投げる
throw new RuntimeException ( context.toString ()
+ " must implement OnFragmentInteractionListener" );
}
}

//アクティビティから切り離されたとき実行される
@Override
public void onDetach () {
super.onDetach ();
mListener = null;
}

//このフラグメントを利用するフラグメントが実装しなければならないリスナインタフェース
public interface OnFragmentInteractionListener {
void onFragmentInteraction ( Uri uri );
}
}

Android雑記

@VisibleForTesting

テストのために、必要以上にスコープを広げていることを示すアノテーション

・MVPではActivityがプレゼンタを生成する

・IntentFilterとは受信したブロードキャストをタグ(アクションと言う)でフィルタリングするもの

テックノート – Junitライブラリ「Mockito」の@Mockと@InjectMocksの使い方

・onCreateとonDestroy、onStartとonStop、onResumeとonPauseで対になる

・onSaveInstanc()はバックキーでは呼ばれない

・永続化したいときはonPause()でBundleに保存

・カスタムビューのXMLとその親のViewGroupのレイアウトの重複を避けるため、XMLの親にmergeを指定する

・カスタムビューを作成するためにはattrs.xmlをいじる

・layoutのXMLをViewGroupに設定するためにはinflateする

・R.styleableはカスタムビューで使用する

・TypedArrayはXMLから値を取得できる、使い終わったらrecycle()

・引数のAttributeSetはXMLの値が入っている

XML → attrs → TypedArray

・Fragmentには引数なしコンストラクタを宣言しておく←リフレクションされるため

・Fragmentを作成する手順の一つは

①Fragmentを継承したクラス宣言

②Fragment用のレイアウトXMLを作成

③ActivityにFragmentを貼り付ける

・ActivityとFragmentが紐付く→onAttach()  解かれる→onDetach()

・Activityと違ってFragmentにはonRestoreInstanceState()はない、つまりスリープからの復帰は単純にはできないが、onCreate~onActivityCreateの引数にBundleがあるのでそこで状態を読み込む

・今存在するフラグメントの取得、新たにフラグメントの作成はFragmentManagerで行う

・Fragmentを生成したとき、その親のActivityのonCreate()も呼び出される。処理を重複して行わないよう注意。

・Fragment.setArguments()でBundleを保持でき、保持したBundleにはFragment.getArguments()でアクセスできる

・addToBackStack()の引数に文字列を指定しておくと、以降にいくらスタックに積まれても、前述のキーを指定すれば一気にそこまで戻れる。普通はnull。

・画面を持たないフラグメントをヘッドレスFragmentという

・ヘッドレスFragmentは回転で再生成する必要はないのでsetRetainInstance(true)する

・しかしActivityは毎回再生成されるのでfindFragmentByTagなど、フラグメントが存在しないことを事前に確認してからヘッドレスFragmentを生成する

・接続状況はConnectivityManagerで取得

・receiverで接続/切断などのイベントが受け取れる

CakePHPのconnect()のアスタリスクの個数

貧欲なスター (greedy star) /* に加えて、 /** 流れ星 (trailing star) 構文が あります。2つのアスタリスクをつなげると、URL の残りを1つの引数として取り込みます。 これは、 / を含む引数を使用したい時に便利です。

$routes->connect(
    '/pages/**',
    ['controller' => 'Pages', 'action' => 'show']
);

 

ルーティング

 配列で取得するか、文字列で取得するかの違いです

JenkinsにてERROR: file not found:

Windowsです。

Jenkinsにてテキストファイルに出力するブツを実行するとビルドが失敗する。

まずそもそもshコマンドが通っていなかった。

Gitによって既にインストールされているのでwhere git してGit\binにPathを通した。

次にERROR: file not found: {区切り文字がなくなったファイルパス} が出力された。

shで実行しているのでWindowsの区切り文字ではなくLinuxの区切り文字に変更した。

するとやっとビルドが成功した。

漢字のcharを理解する

int main(int argc, char **argv) {
char c[] = "大";

char *word = "大同小異";

//sizeofで変数のバイト数を求める
//終端文字が入るので1引く
int byteLen = sizeof( c ) - 1;

//char型には1バイト入る。つまり
//UTF-8の場合、漢字は3バイトなので3
//S_JISの場合、漢字は2バイトなので2が表示される
printf("漢字一文字のバイト数は%d \n",byteLen);


int y;
for (y = 0; y < byteLen; y++) {
//先頭アドレスから1バイトずつ出力する
//繰り返してやっと一つの文字になる
//つまり途中でbreakすると文字化けする
printf("%c", *(word + y));
}
printf("\n");
return 0;
}

 

C言語のアドレス関連

・CLionのデバッグ実行でGDBというデバッガが使える。

p &{変数もしくはメソッド名} でアドレスを表示などが可能。

gdb の使い方・デバッグ方法まとめ

 

・printf("%p",&{変数名});で変数のアドレスが出力出来る。

 

・環境でポインタのサイズは異なる。

32bitでのポインタのバイト数は4バイト (=32bit)
64bitでのバイト数は8バイト (=64bit)

そもそも32bit、64bitとはメモリのアドレスの総組合せ数。

そしてポインタとはメモリのアドレスを示すものであるため、
2^32通りを表すために4バイト、2^64通りのために8バイトが必要。

itpro.nikkeibp.co.jp

そのためポインタのサイズはintでもcharでもfloatでも何でも同じ。
「それなら全部型同じで良くない?」と思ってはいけない。
インクリメントする時にスキップする数が違うため、分ける必要がある。

C言語におけるポインタの勘違い | jikkenjo.net