happasukeの覚書

私がググらなくてもいいよう記事にします。またそのほかにも感じたことも書き綴りたいと思います。

windows10のバグ

windows10でバグを発見したという話はよく聞くし、既出しているかもしれないがなんとなく投稿

 

snipping toolでキャプチャし、英語の小文字、JPGで保存。

そのあとにエクスプローラからファイル名を大文字に書き換えるとエクスプローラ上には小文字のままで表示されてしまう。しかし、プロパティやプロンプトでみてみると変更されている。エクスプローラのバグなのだろう。

【Android stuidioでアプリ開発】 タイトルバーを非表示にする

Androidアプリ開発に手を出してみました。

 

タイトルバーを非表示にする方法はいろいろあるようですが、今回はプロジェクトを新規に作成したときに選ぶことができるActivityのうち、Blanck Activityを選択した場合のタイトルバーを非表示にする方法を載せます。

 

まずこういう画面のBlanck Activityを選択します。

f:id:happasuke:20150504120428p:plain

 

そしてプロンプトに従って設定を進め、プロジェクトの作成を完了させます。

次にプロジェクトのapp → res → values → styles.xmlを編集します。

f:id:happasuke:20150504120948p:plain

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

 ここの<style>タグのparent="Theme.AppCompat.Light.DarkActionBar"を"Theme.AppCompat.NoActionBar"に変更します。

 これで実行するとタイトルバーは消えます。

 

 また、直接マニフェストファイルから操作すると事故ります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ribaasi" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".top_page"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

 

lcpxpresso1769で3色LEDチカチカ

 先日製作してもらった基盤にはLEDがなく、なんとなく寂しかったので久しぶりのはんだ付けで3色LEDを取り付けることにし

ました。パーツはマルツから買ってきました。

 さて使用するピンは余っていた0[16]、0[15]、0[17]です。このピンだとMbedのコードを使うこともできますが、気分でレジスタを打ちます。

f:id:happasuke:20150313220512p:plain

 データシートによると、どうやら0[15]と0[16],0[17]ではピン設定で使用するレジスタが違うようです。

 

 まずはピンにどのような働きをさせるかを設定します。

f:id:happasuke:20150313222812p:plain

0[15]はPINSEL0の30,31ビット目を00とすることでGPIO出力できます。

なので、その部分だけを00にするために以下のようにレジスタを打ちます。

    LPC_PINCON->PINSEL0 &= ~(3<<30);

また他のピンは以下の表より

f:id:happasuke:20150313222819p:plain

同様に

    LPC_PINCON->PINSEL1 &= ~(3<<0);
    LPC_PINCON->PINSEL1 &= ~(3<<2);

とします。

 次にGPIOを入力として使用するのか、出力として使用するのかを設定します。そのためには以下の項目をみます。 

f:id:happasuke:20150313225127p:plain

 該当のピンを1とすることで出力になるようです。使用するのは0[15]~0[16]なので

LPC_GPIO0->FIODIR |= 1<<15;

LPC_GPIO0->FIODIR |= 1<<16;

LPC_GPIO0->FIODIR |= 1<<17;

  と設定します。これで初期化は完了です。ほかにも書き込み制限のマスクなどがあるのですが、ここでは初期設定で十分使用できるのでそのままにします。

 それで、ピンに信号を出力したいときは

LPC_GPIO0->FIOSET |= 1<<15;

で信号がHIGHになり、出力を消したいときには

LPC_GPIO0->FIOCLR |= 1<<15;

で信号がLOWになります。



 

Land of Lispを

 Land of Lispを図書室から借りてしまった

なんてこったい

Land of Lisp

Land of Lisp

 

 

cygwinでsublimeを起動

Cygwinからsublimeを起動したい!と思ったのでやりました。

Cygwin上で、

/usr/lcoal/bin

 にsublという名前で

#!/bin/sh
/cygdrive/c/Program\ Files/Sublime\ Text\ 2/sublime_text.exe $1 &

 を書き込むとなんとプロンプトで

subl

と実行したところ起動しました。

スネークゲームをスマホの加速度センサーで動かす

先日書いたスネークゲームをパソコンだけでなくスマホ用にも書き換えてみました。

書き換えた点は以下の2点です。

  1. サイズをスマホ用に対応させる
  2. 蛇を動かすのに加速度センサーを使う

順にみていきます。

 

1.サイズをスマホ用に対応させる。

html内のhead部分を書き換えました。

metaとしてviewportを指定しました。

表示する幅をこれで固定できます。

 

<head>
    <title>snakegame</title>
    <meta charset="UTF-8"></meta>
    <meta name="keywords" content="snakegame">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximumscale=1.0,user-scalable=no">
</head>

 

2.蛇を動かすのに加速度センサをー使う

せっかくなので加速度センサーで操作できるようにします。

傾けた方向に蛇の頭が向くようにしただけです。

 

まず、htmlに加速度センサーのイベントを追加します。

 最初に割り込みが入ったときだけ元の位置として保存して、そのあとはその値との差分を見てどの方向に傾いているかを判断させます。

 tibanmeflgはセンスがないですね。

window.addEventListener("devicemotion", function(event1){

        x = event1.accelerationIncludingGravity.x;
        y = event1.accelerationIncludingGravity.y;

        if(itibanmeflg==0){
            itibanmeflg = 1;
            basex = x;
            basey = y;
        }

}, true);

 そしてintervalの中で以下の関数を毎回読み込ませます。これでどの方向に進むべきかがわかります。

 body=onLoad()で以下の関数を読み込ませ、

function setScript(){
    init();
    timerId = setInterval("snakeScript()",300);
}

 snakeScript()の中で以下の関数を実行させます。

function readVector(){
    if(basex-x>1){
        if(mike.v!=3)mike.v = 4;
    }else if(basex-x<-1){
        if(mike.v!=4)mike.v = 3;
    }else if(basey-y>1){
        if(mike.v!=2)mike.v = 1;
    }else if(basey-y<-1){
        if(mike.v!=1)mike.v = 2;
    }
}

 こんなところでできます。いい時代になったものです。

 

 

スネークゲームをcanvasで動かしてみる

 先日Processingでスネークゲームを作成しました。

 後輩が課題で作っていたので便乗しました。

 

 それをHTML5canvasに書き換えて動かしてみます。

 

 とりあえずパソコン向けにキーボード操作で動かせるようにしてみます。

 作成したコードがこちら。

<!DOCTYPE html>
<html>
<head>
    <title>snakegame</title>
    <meta charset="UTF-8"></meta>
</head>

<script type="text/javascript">

<!--
var canvas;
var context;

var mouse;    //food's name
var mike;    //snake's name
var c;
var timerId;
var sub=0;

document.addEventListener("keydown",readKey);


var foodClass = (function(){
    //constructor
    var foodClass = function(){
        this.x;
        this.y;
    };

    //method
    var t = foodClass.prototype;

    t.makefood = function(){
        this.x = Math.ceil(Math.random()*24);
        this.y = Math.ceil(Math.random()*24);
    };

    t.drawfood = function(){
        context.fillStyle = 'rgb(0,0,255)';
        context.fillRect(this.x*20,this.y*20,20,20);
    };

    return foodClass;
})();


var snakeClass = (function(){
    //constructor
    var snakeClass = function(){
        this.out = 0;
        this.x = 12;
        this.y = 12;
        this.l = 1;
        this.v = 2;//1:upper 2:down 3:left 4:right
        this.xelm = new Array(300);
        this.yelm = new Array(300);
    };

    //method

    var t = snakeClass.prototype;

    t.falldown = function(){
//         context.clearRect(0,0,500,500);//screen reset
    };

    t.drawSnake = function(){
        if(this.x<25 && this.y<25 && this.x>0 && this.y>0 && this.out==0){

              switch(this.v){
                case 1:this.y--;break;
                case 2:this.y++;break;
                case 3:this.x--;break;
                case 4:this.x++;break;
              }

              this.update();


            context.fillStyle = 'rgb(255,0,0)';

            for(var i=0;i<this.l;i++){
                context.fillRect(this.xelm[i]*20,this.yelm[i]*20,20,20);
            }

        }else{
            clearInterval(timerId);
            alert("game over!  score:" + (this.l-1));

            console.log("elements:")
            for(var i=0;i<this.l;i++){
                console.log(this.xelm[i] + ',' + this.yelm[i]);
            }
            console.log("cul:x" + this.x +' y'+this.y);
        }
    };

    t.eaten = function(){
        console.log("");
        console.log(this.l + ','  + this.x + ',' + this.y);

        this.xelm[this.l] = this.x;
        this.yelm[this.l] = this.y;
        this.l++;

        for(var i=0;i<this.l;i++){
            console.log(this.xelm[i] + ',' + this.yelm[i]);
        }
    };

    t.update = function(){
        for(var i=this.l-1;i>0;i--){
            this.xelm[i] = this.xelm[i-1];
            this.yelm[i] = this.yelm[i-1];
            if(this.yelm[i]==this.y&&this.xelm[i]==this.x){
                this.out = 1;
            }
        }

        this.xelm[0] = this.x;
          this.yelm[0] = this.y;

    };

    return snakeClass;
})();


function setScript(){
    init();
    timerId = setInterval("snakeScript()",200-sub);
}

function figurePropatiesInit(){
    var context = canvas.getContext('2d');

    context.strokeStyle = 'rgb(0,255,0)';
    context.fillStyle   = 'rgb(0,0,255)';
}

function init(){
    canvas = document.getElementById('sketch');
    context = canvas.getContext('2d');
    figurePropatiesInit();

    mouse = new foodClass();
    mouse.makefood();

    mike = new snakeClass();
    c=0;
}


function snakeScript(){

    if(canvas.getContext==null){
        alert("not support");
    }else{

        context.clearRect(0,0,500,500);//screen reset

        mike.drawSnake();
        mouse.drawfood();

        if(mike.x==mouse.x && mike.y==mouse.y){
            mike.eaten();
            mouse.makefood();
        }

        sub += 5;
    }
}


function readKey(e){
    var key = e.keyCode;

    switch(key){
        case 65://a
            if(mike.v!=4)mike.v = 3;
            break;
        case 68://d
            if(mike.v!=3)mike.v = 4;
            break;
        case 87://w
            if(mike.v!=2)mike.v = 1;
            break;
        case 83://s
            if(mike.v!=1)mike.v = 2;
            break;
    }
}

//-->
</script>

<style type="text/css">
    body{
        width:1000px;
    }

    #sketch{
        background-color: #000000;
    }
</style>

<body onLoad="setScript()">

<canvas id="sketch" width="500" height="500">

</canvas>

</body>
</html>

 canvasは初めて使いましたが本当に簡単にものが作れてしまいますね。すごいです。

 

 html5ではスマホの加速度センサーを使えるようなので次はスマホでも動かせるようにしてみようかと思います。