2016年8月12日金曜日

PocketChip Flash

PocketChipだが、色々インストールしていた所、音が鳴らなくなったので、
Flashしなおしてみた。
1.ファイル退避
  といっても、pico-8で試し書きしたlifegame.p8
  くらいしか退避しておくものが無い・・・
  PICO-8のフォルダは
  ~/.lexaloffle/pico-8/carts 以下にある。
  ネットワークフォルダにでもコピペしておくと良い
  (使ったこと無いけど、USBドライブにバックアップしておいてもいいかも?)
2.コネクタ結線
  PocketChipからChipをはすし、
  GroundとFELをコネクタでつなぐ(自分はブレッドボード用の線で繋いだ)
3.Flash作業
  最初Macでやってみたがダメ、USB3だとダメらしい。
  ThinkpadX201TabletのUSB3じゃないUSB端子を使うことにした。
  Chromeをデフォルトブラウザにして、
  こちらのサイトへ行き、http://pcflash.getchip.com/
  PocketChip4.3をつつくと、最初にドライバを入れることになる。
  ドライバを認識させてから、USBでPocketChipと繋いで、
  Flash開始
  20分くらいかかったけど、なんとか終わり、音も出るようになった。
4.あとは ネットワーク設定をしたり、
  sudo apt-get update, sudo-apt-get upgrade したり、
  先程退避したファイルを戻しておしまい。

2016年8月10日水曜日

3D Printer Hot End

Hot Endについて書いておきたい
https://www.youtube.com/watch?v=icLKTOCH9VQ
詰まるのがよっぽど嫌だったのだろう、
とうとう水冷を作った人がいる。
上記URLのレビューによれば、品質は非常に残念な結果だ。

ノズルの重要な点は以下
(1)詰まりにくい
   詰まりにくくするには、溶ける部分が多いとダメ、
   ヒートシンク部分がきちんと冷やされないと、
   上の方まで溶けて、押しても押せなくなって詰まる。
   理想としてはノズルの直前まで、個体で居て欲しい。
(2)高温に出来る
   上の方が溶けないように樹脂を使った物もあるが、
   これだと高温に出来ない。
   高温にできないと様々な素材に対応出来ない。
   (例えば、ColorFabXTとか)
(3)仕上がりが綺麗
   ・アルミブロックに上下からネジが入り込む構造だと、
    アルミブロックの上下からから材料が漏れる。
    漏れる場合は、水道工事用のテープなどをノズルやネジに巻き、    ガスケットのようにして漏れを塞ぐと良い。
    さらに、加熱状態で、もう一度締め込むと良い。
     ノズルが長く、上方に伸び、
    PTFEチューブまで届く構造なら漏れるところが無い。
   ・糸を引かない構造    リトラクションをいくらやっても、
    溶けた材料がノズル内部に溜まっていれば糸をひく、
    シャッターや蓋をつけられないか等、色々アイデアもあるが、
    アルミブロックの体積が多いとその分溶けてるので、
    リトラクションしても無駄。
    引っ込めても、中で溶けてるので糸をひく。
    理想としては、本当に直前まで個体で居て欲しい。
    それが無理ならアルミブロックは5mm位の薄さで有って欲しい。
    VolcanoやPicoはアルミブロックの厚みがかなりあるので、
    相当糸を引くと思う。
   ・ノズルの加工が綺麗であること
    ノズルから出た材料は少し潰されながら引きずられて積層される。
    引きずられる時に前後左右どの方向に動いても、
    綺麗に押しつぶされるように綺麗な加工状態である必要がある。





2016年8月9日火曜日

PICO-8の書き方

https://www.youtube.com/watch?v=ZuaLuMhwcc8
こちらを参考にしました。


英語分からなくても動画見てりゃ分かると思う。

(実際、英語喋ってないで、「お!」とか「あぁ!」とか「ハァハァ」言ってるだけなんで)
まぁ、でも 分かんないかもしれないんで、やり方書いておきます。
(1)PICO-8が起動したらENTER押してコンソールへ
(2)コンソールからREBOOTと入れてENTER
(3)再起動するのでENTERを押すとEDITできます
(4)さらにENTERをするとコンソールへ移るのでRUNで実行
(5)コンソールでSAVE [ファイル名]で保存できます。

(6)コンソールでHELPと入れると色々出てくるんで、後は自分でやってみてください。
 

補足1:初期化は_INIT、画面書き換えの直前は_UPDATE、画面書き換えは_DRAWというファンクション名で記述すれば良いです。
 

補足2:言語はLUAだけど、Math系ライブラリは短縮形で実装されています。こちらを参考にしてください。https://gist.github.com/josefnpat/bfe4aaa5bbb44f572cd0 math.randomはrnd()を使えとか書かれています。

FLEKS3Dその後

みんな買え!
BuildTak より断然良いぞ!
ただし、ABSはやはりヒートベッドつけとかないとダメ!
面倒くさいんで最近ABS全然やってない。
PLAのが匂わないし、PLA系統がもっと進化してくれることを切に願います。

2016年8月1日月曜日

PocketChip Keyboard issue

https://bbs.nextthing.co/t/attempting-to-fix-non-working-keys-and-a-warning/6207/6

本当に残念なことだけど、PocketChipのキーボードが効かないという問題があるようだ。
BackSpaceとENTERをが効かないという人が多いが、自分の手持ちの1台もまったく同じ症状だった。
その1台は社員用に買ったもので、すぐに渡してしまったので、気がつくのが遅れた。
サポートに連絡して、「交換するよ」と返事を頂いている。

基盤に貼り付ける金属のシートがまずいようで、接触が悪いみたいだ。

2016年7月30日土曜日

Ultimaker のCubePazzleをうちのデルタプリンタで刷ってみた

なんかこのフィラメント、弱いんだよなぁ

PocketChipのPico-8でLifeGame作ってみた




とりあえず定番から、
以下にソースも載せとく
JavaScript版と比べてみると、わりとそのままだなってのがわかると思う

ar={}

function _init()
  cls()
  for i=0,31 do
    ar[i] = {}
    for j=0,31 do
      ar[i][j] = flr(rnd(2))
    end
  end
end


function lput(x,y,c,f)
  xx = x*4
  yy = y*4
  if f==1 then
    rectfill(xx,yy,xx+4,yy+4,c)
  else
    rect(xx,yy,xx+4,yy+4,c)
  end
end

function copybuff()
  for i=1,30 do
    ar[i][0]  = ar[i][30]
    ar[i][31] = ar[i][1]
  end
  for j=1,30 do
    ar[0][j]  = ar[30][j]
    ar[31][j] = ar[1][j]
  end
  ar[0][0]   = ar[30][30]
  ar[31][31] = ar[1][1]
  ar[0][31]  = ar[30][1]
  ar[31][0]  = ar[1][30]
end

function deadoralive()
  br = {}
  for i=0,31 do
    br[i] = {}
    for j=0,31 do
      br[i][j] = ar[i][j]
    end
  end

  for i=1,30 do
   br[i] = {}
    for j=0,31 do
      br[i][j] = ar[i][j]
    end
  end

  for i=1,30 do
    for j=1,30 do
      cnt = br[i-1][j-1] + br[i][j-1] + br[i+1][j-1]
          + br[i-1][j  ]              + br[i+1][j  ]
          + br[i-1][j+1] + br[i][j+1] + br[i+1][j+1]
      if     br[i][j]==1 and (cnt==2 or cnt==3) then
      elseif br[i][j]==0 and cnt==2 then
      elseif br[i][j]==0 and cnt==3 then
        ar[i][j] = 1
      else
        ar[i][j] = 0
      end
    end
  end
end

function draw()
 for i=1,30 do
    for j=1,30 do
      lput(i,j,1,1)
      if ar[i][j]==1 then
        lput(i,j,7,1)
      else
        lput(i,j,2,0)
      end
    end
  end
end

function _draw()
  copybuff()
  deadoralive()
  draw()
end

2016年7月26日火曜日

lifegame (JavaScript)

lifegame 作ってみた
短くするのが目的ではなく、何をしてるのか分かるように書いたつもり


=====html=====
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
  <title>lifegame</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>lifegame</h1>
  <canvas id ="c" width="300" height="300" />

  <script src="script.js"></script>
</body>
</html>
=====Javascript=====
window.addEventListener('load', init(30,30), false);

function init(m,n){
  // 横方向の配列作って、
  var la = new Array();
  // 縦方向に配列を追加する
  for(i=0;i<m+2;i++){
    la[i] = new Array();
    for(j=0;j<n+2;j++){
      la[i][j] = Math.floor(Math.random()*2);
    }
  }

  DrawProc(la,m,n);
}

function DrawProc(la,m,n)
{
  CopyBuff(la,m,n);
  DeadOrAlive(la,m,n);
  draw(la,m,n);
  setTimeout(DrawProc, 100,la,m,n);
}

function CopyBuff(la,m,n)
{
  // 上下をコピー
  for(i=1;i<m+1;i++){
    la[i][0]   = la[i][n];
    la[i][n+1] = la[i][1];
  }
  // 左右をコピー
  for(j=1;j<n+1;j++){
    la[0  ][j]   = la[m][j];
    la[m+1][j] = la[1][j];
  }
  // 四隅をコピー
  la[  0][  0] = la[m][n];
  la[m+1][n+1] = la[1][1];
  la[  0][n+1] = la[m][1];
  la[m+1][  0] = la[1][n];
}

function DeadOrAlive(la,m,n)
{
  // la から lbにコピー
  var lb = new Array();
  for(i=0;i<m+2;i++){
    lb[i] = new Array();
    for(j=0;j<n+2;j++){
      lb[i][j] = la[i][j];
    }
  }

  // lb を評価しながらla に設定
  for(i=1;i<m+1;i++){
    for(j=1;j<n+1;j++){
      var cnt = lb[i-1][j-1]+lb[i][j-1]+lb[i+1][j-1]
              + lb[i-1][j  ]           +lb[i+1][j  ]
              + lb[i-1][j+1]+lb[i][j+1]+lb[i+1][j+1];

      if(lb[i][j]==1&&(cnt==2||cnt==3)){
        // 生きててカウントが2か3
        // そのまま生きる
      }else if(lb[i][j]==0&&cnt==2){
        // そのまま死んどく
      }else if(lb[i][j]==0&&cnt==3){
        // 生まれる
        la[i][j] = 1;
      }else{
        // それ以外は死
        la[i][j] = 0;
      }
    }
  }
}

function draw(la,m,n){
  var canvas = document.getElementById('c');
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  

  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      if (la[i+1][j+1]==1){
        ctx.fillStyle = "white";
        ctx.fillRect(i*10, j*10, 10, 10);
      }else{
        ctx.fillStyle = "gray";
        ctx.fillRect(i*10, j*10, 10, 10);
        ctx.strokeStyle = "white";
        ctx.strokeRect(i*10, j*10, 10, 10);
      }
    }
  }
}
=====css=====
@charset "UTF-8";

#c {
  color: gray;
  background-color:gray;
}



ようやく$9コンピュータのChipが届きました

一つは社員用、もう一つは俺用
とりあえず動作確認

Wi-Fi設定し、ターミナルでlsしてみた
スクロールバーも横に出る
いい感じです
perlも入ってる
vi で打ち込んでみた



2016年7月17日日曜日

重複しない乱数生成(JavaScript)

あまりにも考えなしに重複しない乱数生成とかウェブで公開している連中がいるので、正解をここに上げとく
ちなみに不正解なのは、
一度出た乱数を除外したり、配列に入れといてかき混ぜたりするやり方です。
なんで不正解なのかよく考えて欲しい。
下のやり方は、配列に入れといて、出たらその数を消すやり方
いわゆる物理的世界でのビンゴゲームと一緒のやり方だ。
ついでに左からのゼロ補完もやってる
文字の妥当性チェックは面倒なので数値かどうかだけ、マイナスだったり小数だったりはチェックしてない


----html----
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
  <title>重複のない乱数</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>重複のない乱数</h1>
  乱数の個数<br>
  <input type=text id="num" /><input type =button value = "開始" onClick="Start()" />
  <div id="test"></div>
  <script src="script.js"></script>
</body>
</html>
----css----
@charset "UTF-8";

#test {
  color: blue;
}

----js----
window.addEventListener('load', function(e) {
  // ここでは特に何もしない
}, false);


function initCollection(n,nums) {
  // nums 配列に1-nをセットする
  for(var i=0;i<n;i++){
    nums[i] = i+1;
  }
}
function Start(){
  // 配列を定義
  var nums = new Array();
  // test のエリアを消す
  document.querySelector('#test').innerHTML = "";
  // 入力された値を取得
  var n = document.getElementById("num").value;
  // 数値判定
  if(isNaN(n)){
    window.alert("数値を入れてください");
    document.getElementById("num").value = "";
    return;
  }

  // nums 配列を初期化
  initCollection(n,nums);

  // zero 補完用文字列を準備
  var nLen = n.length
  var zero='';
  for(var i=0;i<nLen;i++){
    zero += '0';
  }

  var cnt = 1;
  for(var i=n;i>0;i--){
    // 乱数生成
    var rnd = Math.floor(Math.random()*i);
    // カウントとnums のrnd番目を表示
    document.querySelector('#test').innerHTML +=
        (zero+cnt).slice(-nLen) +':' + nums[rnd]+ '<br>';
    // rnd 番目を削除
    nums.splice(rnd,1);
    // カウントをインクリメント
    cnt++;
  }
}