端末の発着信履歴を表示

public class CallLogActivity implements SensorEventListener {
	SensorManager sensorManager;
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
		
		Cursor c = getContentResolver().query(
				android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
				android.provider.CallLog.Calls.DATE+ " DESC");
		startManagingCursor(c);
		ListAdapter adapter = new SimpleCursorAdapter(this,
				R.layout.calllog_row, c, new String[] {
				android.provider.CallLog.Calls.TYPE,
				android.provider.CallLog.Calls.NUMBER,
				android.provider.CallLog.Calls.CACHED_NAME },
				new int[] { R.id.type, R.id.number, R.id.name }) {
			@Override
			public void setViewImage(ImageView v, String value){
				switch (Integer.parseInt(value)){
				case android.provider.CallLog.Calls.INCOMING_TYPE:
					v.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_call_incoming));
					break;
				case android.provider.CallLog.Calls.MISSED_TYPE:
					v.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_call_missed));
					break;
				case android.provider.CallLog.Calls.OUTGOING_TYPE:
					v.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_call_outgoing));
					break;
					default:
						break;
				}
			}
		};
		setListAdapter(adapter);
	}
	
	// activity
	@Override
	protected void onResume(){
		super.onResume();
		sensorManager.registerListener(this,
				sensorManager.getDefaultSensor(Sensor.TYPE_ACCELERAOMETER),
				SensorManager.SENSOR_DELAY_UI);
	}
	@Override
	protected void onStop(){
		sensorManager.unregisterListener(this);
		super.onStop();
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id){
		telTo(((TextView) v.findViewById(R.id.number)).getText());
	}
	
	public void onSensorChanged(SensorEvent event){
		switch(event.sensor.getType()){
		case Sencor.TYPE_ACCELEROMETER:
			if (getSelectedItemPosition() > -1){
				if (Math.abs(event.values[0]) > SensorManager.GRAVITY_EARTH
				|| Math.abs(event.values[1]) > SensorManager.GRAVITY_EARTH
				|| Math.abs(event.values[2]) > SensorManager.GRAVITY_EARTH) {
					telTo(((TextView) getListView().getChildAt(
							getSelectedItemPosition()).findViewById(R.id.number)).getText());
				}
			}
			default:
		}
}

ARMプロセッサ

チップの設計には、基盤の部品を減らす、消費電力を抑えるなどの理由から、演算機能、グラフィックス機能、I/Oコントローラなどが1チップ化したSoCがよく採用されます。そして、ARMアーキテクチャは、そのSoCの一部として利用されています。

ARMアーキテクチャを設計しているARM社はファブレスメーカーです。

簡易sleepコマンド

#include < time.h >
#include < stdio.h >
#include < stdlib.h >

int main(int argc, char **argv)
{
    struct timespec req;
    char *end;
    
    if(
        argc != 2 ||
       argv[1][0] == '\0' ||
       (req.tv_sec = strtol(argv[1], &end, 10), *end != '\0')
       ) {
        fprintf(stderr, "Usage: %s seconds \n", argv[0]);
        return 1;
    }
    
    req.tv_nsec = 0;
    
    if (nanosleep(&req, NULL) < 0){
        perror("naosleep");
        return 1;
    }
    return 0;
}

whoamiコマンド

getpwuid()を使います。

#include < unistd.h >
#include < sys/types.h >
#include < pwd.h >
#include < stdio.h >

int main(){
    pid_t euid;
    struct passwd *pw;

    euid = geteuid();

    if((pw = getpwuid(euid))== NULL){
        printf("%d\n", (int)euid);
    } else {
        printf("%s\n", pw->pw_name);
    }
    return 0;
}

簡易touchコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < utime.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for (i = 1; i < argc; i++){
        open (argv[i], O_WRONLY|O_CREAT, 0666);
        
        if (utime(argv[i], NULL)){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易rmコマンド

#include < unistd.h >
#include < stdio.h >

int main(int argc, char ** argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for (i = 1; i < argc; i++){
        if (unlink(argv[i]) < 0){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易mkdirコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for(i = 1; i < argc; i++){
        if(mkdir(argv[i], 0777)<0){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易lnコマンド

ln -s source destとln source destの形式に対応。

#include < unistd.h >
#include < stdio.h >
#include < string.h >

int main(int argc, char **argv)
{
    int s_flag;
    
    if (
        argc <= 2 || argc >= 5 ||
        (s_flag = (strcmp(argv[1], "-s")==0), argc == 3 && s_flag)|| (argc == 4 && !s_flag))
    {
        fprintf(stderr, "Usage: %s [-s] source dest\n", argv[0]);
        return 1;
    }
    if (s_flag){
        if (symlink(argv[2], argv[3]) < 0){
            perror("symlink");
            return 1;
        }
    } else {
        if (link(argv[1], argv[2])< 0){
            perror("link");
            return 1;
        }
    }
    return 0;
}

簡易cp -pコマンド

コピー元のファイルのタイムスタンプ、ファイル所有者、ファイルモードをコピー先のファイルに設定。

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >
#include < utime.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int fd_r, fd_w;
    ssize_t n;
    int err = 0;
    struct stat s_buf;
    struct utimbuf u_buf;
    char buf[4096];
    
    if (argc != 3){
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }
    
    if ((fd_r = open(argv[1], O_RDONLY)) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if (fstat(fd_r, &s_buf) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if ((fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){
        perror(argv[2]);
        return 1;
    }
    
    while((n = read(fd_r, buf, sizeof buf)) > 0){
        if (write(fd_w, buf, n)< 0){
            perror(argv[2]);
            return 1;
        }
    }
    if (n < 0){
        perror(argv[1]);
        return 1;
}
    u_buf.actime = s_buf.st_atime;
    u_buf.modtime = s_buf.st_mtime;
    
    if (utime(argv[2], &u_buf)){
        perror(argv[2]);
        err = 1;
    }
    
    fchown(fd_w, s_buf.st_uid, s_buf.st_gid);
    
    if (fchmod(fd_w, s_buf.st_mode)<0){
        perror(argv[2]);
        err = 1;
    }
    return err;
}

簡易cpコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >
#include < stdio.h >

int main (int argc, char ** argv)
{
    int fd_r, fd_w;
    ssize_t n;
    char buf[4096];
    
    if (argc != 3){
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }
    
    if ((fd_r = open(argv[1], O_RDONLY)) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if ((fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){
        perror(argv[2]);
        return 1;
    }
    while ((n = read(fd_r, buf, sizeof buf)) > 0){
        if(write(fd_w,buf, n)< 0){
            perror(argv[2]);
            return 1;
        }
    }
    if (n < 0){
        perror(argv[1]);
        return 1;
    }
    return 0;
}