2016年6月24日金曜日

[RaspberryPi]RpiをArduinoライターにする


色々試行錯誤してようやくできたでまとめて置く。


Step1.ソフトのインストール
$ sudo apt-get install bison automake autoconf flex git gcc
$ sudo apt-get install gcc-avr binutils-avr avr-libc
$ wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz
$ ./configure --prefix=/opt/avrdude --enable-linuxgpio

Step2.ソースの修正
 なせかprintf("%ud",gpio) という部分で 数字d となって 文字列が正しく出ない問題があるので
linuxgpioのソース上にある  %ud を全て %d に書き換える。

Step3. avrdude.confの修正
 下図のようなピン配置にした場合、
  まずソース内に入っているavrdude.confを開き、「linuxgpio」で検索して、以下の様に編集する。

------------------------------------------------------------
programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 12;
  sck   = 16;
  mosi  = 20;
  miso  = 21;
;
------------------------------------------------------------



avrマイコンを書き込む用のピンアサイン

電源は3.3VとGNDを使う事。
(5Vでも良いが、RPI自身が3.3V/5Vトレラントでないので注意しておくと良い)


もしDigisparkを使う場合は最後の行に以下の内容も追記しておく。

#------------------------------------------------------------
# ATtiny87
#------------------------------------------------------------
# Changes against ATtiny167 (beside IDs)
#    memory "flash"
#        size            = 8192;
#        num_pages       = 64;
part
     id            = "t87";
     desc          = "ATtiny87";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4,
               0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB,
               0xBF, 0x99, 0xF9, 0xBB, 0xAF;
## no STK500 devcode in XML file, use the ATtiny45 one
     stk500_devcode   = 0x14;
##  avr910_devcode   = ?;
##  Try the AT90S2313 devcode:
     avr910_devcode   = 0x20;
     signature        = 0x1e 0x93 0x87;
     reset            = io;
     chip_erase_delay = 1000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
     chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                        "x x x x  x x x x    x x x x  x x x x";
    timeout     = 200;
    stabdelay       = 100;
    cmdexedelay     = 25;
    synchloops      = 32;
    bytedelay       = 0;
    pollindex       = 3;
    pollvalue       = 0x53;
    predelay        = 1;
    postdelay       = 1;
    pollmethod      = 0;
    pp_controlstack     =
        0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E,
        0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E,
        0x06, 0x16, 0x46, 0x56, 0x0A, 0x1A, 0x4A, 0x5A,
        0x1E, 0x7C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 20;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;
    idr                 = 0x00;
    spmcr               = 0x57;
    allowfullpagebitstream = no;
     memory "eeprom"
         size            = 512;
        paged           = no;
        page_size       = 4;
         min_write_delay = 4000;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read            = "1  0  1  0   0  0  0  0    0 0 x x  x x x a8",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
         write           = "1  1  0  0   0  0  0  0    0 0 x x  x x x a8",
                           "a8 a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";
  loadpage_lo   = "  1   1   0   0      0   0   0   1",
        "  0   0   0   0      0   0   0   0",
        "  0   0   0   0      0   0  a1  a0",
        "  i   i   i   i      i   i   i   i";
  writepage = "  1   1   0   0      0   0   1   0",
        "  0   0   x   x      x   x   x   x",
        "  0   0  a5  a4     a3  a2   0   0",
        "  x   x   x   x      x   x   x   x";
  mode      = 0x41;
  delay     = 10;
  blocksize = 4;
  readsize  = 256;
       ;
     memory "flash"
         paged           = yes;
         size            = 8192;
         page_size       = 128;
         num_pages       = 64;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0    0   0   0   0",
                           "  0   0   0  a12  a11 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2   a1  a0",
                           "  o   o   o   o    o   o   o   o";
         read_hi         = "  0   0   1   0    1   0   0   0",
                           "  0   0   0  a12  a11 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2   a1  a0",
                           "  o   o   o   o    o   o   o   o";
         loadpage_lo     = "  0   1   0   0    0   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x  a5  a4   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";
         loadpage_hi     = "  0   1   0   0    1   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x  a5  a4   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";
         writepage       = "  0  1  0  0   1   1   0  0",
                           "  0  0  0  0  a11 a10 a9 a8",
                           " a7 a6 a5  x   x  x  x  x",
                           "  x  x  x  x   x  x  x  x";
  mode      = 0x41;
  delay     = 10;
  blocksize = 64;
  readsize  = 256;
       ;
#   ATtiny87 has Signature Bytes: 0x1E 0x93 0x87.
     memory "signature"
         size            = 3;
         read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                           "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
       ;
     memory "lock"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 1 1 x  x x x x",
                           "x x x x  x x x x  x x x x  x x i i";
         read            = "0 1 0 1  1 0 0 0  0 0 0 0  0 0 0 0",
                           "0 0 0 0  0 0 0 0  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "lfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";
         read            = "0 1 0 1  0 0 0 0  0 0 0 0  0 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "hfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  1 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";
         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "efuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                           "x x x x  x x x x  x x x x  x x x i";
         read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
     ;
     memory "calibration"
         size            = 1;
         read            = "0  0  1  1   1  0  0  0    0 0 0 x  x x x x",
                           "0  0  0  0   0  0  0  a0   o o o o  o o o o";
     ;
  ;
#------------------------------------------------------------
# ATtiny167
#------------------------------------------------------------
part
     id            = "t167";
     desc          = "ATtiny167";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4,
               0x00, 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB,
               0xBF, 0x99, 0xF9, 0xBB, 0xAF;
## no STK500 devcode in XML file, use the ATtiny45 one
     stk500_devcode   = 0x14;
##  avr910_devcode   = ?;
##  Try the AT90S2313 devcode:
     avr910_devcode   = 0x20;
     signature        = 0x1e 0x94 0x87;
     reset            = io;
     chip_erase_delay = 1000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
     chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                        "x x x x  x x x x    x x x x  x x x x";
    timeout     = 200;
    stabdelay       = 100;
    cmdexedelay     = 25;
    synchloops      = 32;
    bytedelay       = 0;
    pollindex       = 3;
    pollvalue       = 0x53;
    predelay        = 1;
    postdelay       = 1;
    pollmethod      = 0;
    pp_controlstack     =
        0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E,
        0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E,
        0x06, 0x16, 0x46, 0x56, 0x0A, 0x1A, 0x4A, 0x5A,
        0x1E, 0x7C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 20;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;
    idr                 = 0x00;
    spmcr               = 0x57;
    allowfullpagebitstream = no;
     memory "eeprom"
         size            = 512;
        paged           = no;
        page_size       = 4;
         min_write_delay = 4000;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read            = "1  0  1  0   0  0  0  0    0 0 x x  x x x a8",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
         write           = "1  1  0  0   0  0  0  0    0 0 x x  x x x a8",
                           "a8 a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";
  loadpage_lo   = "  1   1   0   0      0   0   0   1",
        "  0   0   0   0      0   0   0   0",
        "  0   0   0   0      0   0  a1  a0",
        "  i   i   i   i      i   i   i   i";
  writepage = "  1   1   0   0      0   0   1   0",
        "  0   0   x   x      x   x   x   x",
        "  0   0  a5  a4     a3  a2   0   0",
        "  x   x   x   x      x   x   x   x";
  mode      = 0x41;
  delay     = 10;
  blocksize = 4;
  readsize  = 256;
       ;
     memory "flash"
         paged           = yes;
         size            = 16384;
         page_size       = 128;
         num_pages       = 128;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0    0   0   0   0",
                           "  0   0   0  a12  a11 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2   a1  a0",
                           "  o   o   o   o    o   o   o   o";
         read_hi         = "  0   0   1   0    1   0   0   0",
                           "  0   0   0  a12  a11 a10  a9  a8",
                           " a7  a6  a5  a4   a3  a2   a1  a0",
                           "  o   o   o   o    o   o   o   o";
         loadpage_lo     = "  0   1   0   0    0   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x  a5  a4   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";
         loadpage_hi     = "  0   1   0   0    1   0   0   0",
                           "  0   0   0   x    x   x   x   x",
                           "  x   x  a5  a4   a3  a2  a1  a0",
                           "  i   i   i   i    i   i   i   i";
         writepage       = "  0  1  0  0   1   1   0  0",
                           "  0  0  0  0  a11 a10 a9 a8",
                           " a7 a6 a5  x   x  x  x  x",
                           "  x  x  x  x   x  x  x  x";
  mode      = 0x41;
  delay     = 10;
  blocksize = 64;
  readsize  = 256;
       ;
#   ATtiny167 has Signature Bytes: 0x1E 0x94 0x87.
     memory "signature"
         size            = 3;
         read            = "0  0  1  1   0  0  0  0   0  0  0  x   x  x  x  x",
                           "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
       ;
     memory "lock"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 1 1 x  x x x x",
                           "x x x x  x x x x  x x x x  x x i i";
         read            = "0 1 0 1  1 0 0 0  0 0 0 0  0 0 0 0",
                           "0 0 0 0  0 0 0 0  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "lfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";
         read            = "0 1 0 1  0 0 0 0  0 0 0 0  0 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "hfuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  1 0 0 0",
                           "x x x x  x x x x  i i i i  i i i i";
         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
       ;
     memory "efuse"
         size            = 1;
         write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                           "x x x x  x x x x  x x x x  x x x i";
         read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
     ;
     memory "calibration"
         size            = 1;
         read            = "0  0  1  1   1  0  0  0    0 0 0 x  x x x x",
                           "0  0  0  0   0  0  0  a0   o o o o  o o o o";
     ;
  ;


Step4.ビルド&インストール
$ make
$ sudo make install



Step5.配線


Digispark ATTiny85の場合は、

D0―MOSI
D1―MISO
D2―SCK
D5―RESET


Digispark pro ATTiny167の場合は、

PA2―MISO
PA4―MOSI
PA5―SCK
PB7―RESET


接続する時の注意ですが、MISO/MOSIはクロス接続にすること。
ストレート接続すると、TX-TX、RX-TXみたいな具合になって通信できません。


Step6.動作確認結果

$ sudo avrdude -c linuxgpio -pt167
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9487 (probably t167)
avrdude: safemode: Fuses OK (E:FE, H:DD, L:DF)
avrdude done.  Thank you.


以上まとめでした。

2016年6月15日水曜日

基板を作る時に便利なサービスサイト「Fusion PCBA」

サービスに部品実装まである。
特殊パーツがDegikeyなどで購入可能であれば調達までしてくれるという便利さで、かなりお得意様になりそう。

http://qiita.com/mayfair/items/0206bd437c4302be5500

[RaspberryPi]SDカードが壊れたときの修復方法


$ sudo e2fsck /dev/sda2 -c -y

このコマンドを1日くらいかけて実行すれば治る

2016年6月4日土曜日

[RaspberryPi]TS動画をインタレ保持リサイズしてDVDサイズで保存する方法

2016.06.01時点で最新のffmpegはRPiのh264ハードウェアエンコに対応してます。

ってことでlibfdk_aacを追加してffmpegをコンパイル。


タイトルにある通り、インターレースを保持しつつリサイズしてMpeg2からMpeg4にトランスコードしたい。(Chromebookで動画を観たいため)

ということでコマンドを色々調べて見つけた決定版はコレ↓

ffmpeg -c:a libfdk_aac -i 動画名.ts -vf yadif=1,tinterlace=4 -c:v h264_omx -s 720x540 -c:a libfdk_
aac -b:v 2500k -aspect 16:9 -q:a 128 -ar 44100 -vsync 1 -threads 0 -flags +ilme+ildct -y 保存名.mp4



エンコ時間の目安ですが、RPi1だと0.7fps、RPi2だと1fps、RPi3だと5fpsくらいでした。
24時間稼働させるから気にならないよね。。

2016年5月4日水曜日

ソフトウェア設計の最適化方法

ソフトウェア設計の最適化方法


ソースコードとは
 まず、ソースコードで求められているものはなんだろう。というテーマから入って説明したいと思います。
 世の中には
 ・ウォーターフロー開発モデル
 ・アジャイル開発モデル
 ・アスペクト開発モデル
 ・プロトタイプ開発モデル

などいろんな手法が考案されて、様々な現場で利用されているのではないでしょうか。

運用する時は、組織体系に合わせて世の中一般の開発モデルをカスタマイズされているので
A社、B社が同じ開発モデルを利用していて、あるプロジェクトで情報を共有して共同開発しようなんて場面に出くわした時は
必ずといって情報の一元化を行いましょう、という合言葉とともに本来不要なプロセスが発生する。
(同じ開発モデルだから相性はいいが、完全一致させることは不可能と思われる)


情報とは
 熱力学のエントロピーという言葉を耳にしたことがあると思う。

これは、
 集約されている状態は秩序が保たれていてエントロピーは小さく、
 散っていて無秩序な状態のことをエントロピーが大きいと表現している。

この考え方は情報分野にも当てはめることができる。
圧縮アルゴリズムを勉強した人はハフマン符号化を学ぶときに情報エントロピーという言葉が出てくる。
情報エントロピーとは、これ以上圧縮できないデータ量の事で、冗長性が非常に小さい状態のことを意味する。

前の話で組織間で出てきた「情報の一元化」とは、
お互い同じ情報を扱っているのに散ってしまう情報を打破するために行われる手法だという事を意味している事が分かる。
もう少しわかりやすい表現に変化させてみよう。
「情報の一元化」を別の言い方で表すと、「枠組みの中で情報の整理整頓を行う」となる。
ここで出てきた枠組みの中でというのが社間を意味し、そこで得られた情報を整理整頓を行うことである。
つまり社間では情報の中身ではなく、情報の出入りの話であって、これは仕様書などのドキュメントを台帳管理しようという事を示している。


ソフトウェア仕様とエントロピー
 少しずつ現場レベルに考え方をシフトしていく。
ハフマン符号化に出てくる情報エントロピーの考え方でいくと、
「冗長性をなくす」事でエントロピーが小さく、秩序が保たれているとこである事を意味している。
この考えは同じものが無ければまとまっているように思えるが、ソフトウェアの場合は時間軸があり仕様変更があるので、情報エントロピーという考えで情報をまとめることは難しい。
そこで原点に戻って、熱力学のエントロピーには「エントロピーの増大の法則」というものがあり、時間が経過していくとエントロピーは増加するというものである。

この考えを当てはめると、ソフトウェアは時間と共に仕様変更が行われ、エントロピーが増大していく。

と言える。

つまりソフトウェアの性質上、仕様変更が発生して、追加・変更・削除が設計・コードに反映される。

ソフトウェアの変化を管理する事でエントロピーの増大を記録することができる。(減少はしない)

裏返しにするとエントロピーが減るような仕様書は無い、仕様変更は工数が発生して費用が発生するという事が言える。


ソフトウェア設計とエントロピー
 仕様変化することでエントロピーが増大するという事を説明した。
次に仕様と設計について述べていこうと思う。

熱力学でいうと 熱エネルギーは 高いものから低いものへ移動していくというものがある。

これを仕様=熱いもの  設計=低いもの に例えると、
仕様書から設計書へ情報を移すと散らばる(千差万別)と表現してみると分かりやすいのではないだろうか。

設計書を書くとエントロピーが増大していくのは自ら苦しめていくようなものなので、
よくある事例を出すと書き方の統一である。

最近ではUMLで図の書き方を統一しようという動きはあるが、
設計書に適用する場合は運用ルールを決めて、書き方のテンプレートとガイドラインを用意しておくと良い。
また仕様変更で変化した場合は新たにドキュメントを作成しバージョン管理して
変化内容と以前の仕様、最終仕様を明確化しておく事とトレーサビリティが保たれる。


ソースコードとエントロピー

現場でよくあることは、
・Aさんのコードはまとまっていて見やすいコードを書く
・Bさんのコードは乱雑なコードを書く

というように人によって書き方が変わって秩序が乱れエントロピー増大に繋がっていることがある。

これも設計と同じように、書き方のテンプレートやガイドライン、フレームワークを利用する事で
書き方が統一できるようになる。
もう少し細かく書くと、
仕様とは、構造と機能の2つに分類され、
構造はフレームワーク
機能はユースケース、ステートマシン、外部通信仕様などに分類して表せることができて、それぞれに追加・変更・削除
がある。

機能の追加や変更、削除はオブザーバブルなものであって、
ある機能を 
 使う(Main)
 動かす(Sub)
 評価(Test)

に分けることで分担作業が可能になって機能を分割しやすくなる。

より具体的に説明すると、
 Mainクラス(上位:使う側)
 Subクラス(下位:実働側)
 Test(Mainクラスで使い方サンプル集みたいなもの)

の3つに分けて実装し、
機能の管理はMainで行われて、機能の実装はSubクラスで行う
TestクラスでSubクラスの品質評価を行い、
Mainクラス側でビジネスフローを実装する。

こんな具合になる。
これでエントロピーが減らせるのか?と思うだろうが、
仕様変更が起こると 仕様変更(Main)、機能変更(Sub)、変更に伴う評価(Test)
それぞれに作用が行われ、どの規模の変更が起きたのかが現場レベルで実感しやすくなり、
対費用効果の算出などに有用であることが分かる。
例えば、
 ・仕様追加ならMain・Sub・Testに影響
 ・仕様変更ならMainに影響(ビジネスフローは人力で評価を想定)
 ・機能変更ならSub・Testに影響


ざっくりまとめると、
 ・仕様書のバージョン管理
 ・WBSによる機能対応表
 ・ソースコードの実装を分担化

となる。

より精度の高い最適化を行うのであれば、エントロピーの増大について学んで
エントロピーを減らすことはできない事を理解して、いかにして増大するを抑止するかを考えてみると良いと思います。

2016年4月22日金曜日

[Windows]シャットダウン時に出てくる「x個のプログラムが閉じられていません」を出さないようにする方法

・シャットダウン時に出てくる「x個のプログラムが閉じられていません」を出さないようにする方法


①WIN+Rを押して「gpedit.msc」と入力する。

②ローカルグループポリシーエディターが起動したら
「コンピューターの構成」→「管理者テンプレート」→「システム」→「シャットダウンオプション」を選択。

③「シャットダウンをブロックするか取り消すアプリケーションの自動終了をオフにする」をダブルクリックして「有効」にする。



参考URL
http://windows7.wiki.fc2.com/wiki/%E7%B5%82%E4%BA%86%E6%99%82%E3%81%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%BC%B7%E5%88%B6%E7%B5%82%E4%BA%86%E3%81%AE%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%82%92%E5%87%BA%E3%81%95%E3%81%AA%E3%81%84

2016年4月20日水曜日

[RaspberryPi]RpiでツイッターBotを作る

[RaspberryPi]RpiでツイッターBotを作る



【Bot用アカウント作成編】

Step1.Twitterアカウントの作成
 https://twitter.com/

 ※電話認証は済ませておくこと。


Step2.アプリ登録
 https://dev.twitter.com/apps/

 PermissionでAccessをRead and write にチェックを入れて、Update Settingsする。

Step3.APIKeyとシークレットキーを取得する。
Keys and Access Tokensタブを開くと、Application Settingsに記載してあるキーをメモしておく。



【RPi環境構築編】

Step1.環境構築
$ sudo pip install twython requests requests_oauthlib

Step2.Botアプリ用フォルダを作成
$ mkdir twitterBot
$ cd twitterBot
$ vim TempBot.py

----
#!/usr/bin/env python
#coding:utf-8

import os
from twython import Twython

#Twitterアカウントの認可情報
CONSUMER_KEY = ‘Consumer key’
CONSUMER_SECRET = ‘Consumer secret’
ACCESS_KEY = ‘Access token’
ACCESS_SECRET = ‘Access token secret’

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#Raspbianの制御コマンド(vcgencmd)を実行
cmd = ‘/opt/vc/bin/vcgencmd measure_temp’
line = os.popen(cmd).readline().strip()
temp = line.split(‘=’)[1].split(“‘”)[0]

#取得したCPU温度を投稿
api.update_status(status=’CPU no ondo ha ‘+temp+’do desu ‘)  
----

$ sudo chmod +x TempBot.py


Step3.実行する

$ ./TempBot.py




参考URL
http://pettomo.azurewebsites.net/?p=4101

2016年4月14日木曜日

[Xamarin]バージョン2.0.06482、2.1.0.6529はスキップして2.2系列が出るのを待った方がよい理由

バージョン2.0.06482、2.1.0.6529はスキップした方がよい理由


これら2つのバージョンは、2016年3月31日(本土時間)、マイクロソフトがXamarinをオープンソース化を発表した時点のXamarinバージョンになります。


それまでは製品版として販売していたのだからすぐ使えるくらいの品質かというとそうでもありませんでした。
(きっとVisual Studio環境下のXamarinはまだアルファ版レベルなのだろう。。。)

特に2.1.0.6529は古いバージョンに依存していて、まともに使えたものではない、そんな状況になっています。

まとめると、
 2.0はかなり古いけど使える。
 2.1はメジャーバージョンだけど、依存ライブラリのバージョンを下げないと使えない。
 2.2はオープンソース化になって初めてのメジャーバージョンになる(現在Pre版)

ということで、まともになるのはそれ以降の2.2系列、
頻繁にXamarin.Formsプレビュー版2.2.*系列が更新されているので、それが正式版になるまで待った方が無難です。


バージョン2.2が出るまでに環境構築を覚えておきたい!って思った方用に情報をまとめておきました。

下記TIPSはどのバージョンでも共通した内容なので覚えておいて損はありません。



~準備編~

・Xamarinのバージョンをベータ版を使用する
 ツール -> オプション -> Xamarin -> Other -> Beta版を選択
 https://developer.xamarin.com/recipes/cross-platform/ide/change_updates_channel/



~プロジェクト作成~

・新規プロジェクト作成
 Cross-Platform -> Blank App(Xamarin.Forms Potable)を選択


・ビルド構成を設定する
 ソリューションエクスプローラーにあるソリューションを右クリックを押してビルド構成を選択


・ソリューション全体のXamarinパッケージをアップデートする
 ツール -> Nuget -> ソリューションのNugetを管理する -> 更新プログラムからパッケージを更新。
 ※表題どおりバージョンが2.1.0.6529はアップデートするとエラーばかり出て使えないので注意。


~番外編~

・SQLite-netを使う
 http://javatechig.com/xamarin/using-sqlite-net-orm-in-xamarin-application



2016年4月4日月曜日

[Xamarin]VSユーザーからみたXamarin入門(2)


今回は広告Admobを表示してみる編です。

※現時点2016.04.04 Businessプラン以上のライセンスでないと使えないようになっています。

まず何をするかというと、Google Play Serviceをインストールすることから始まる。

どうやっていれるんだって思っていたら、

Componentsを右クリックする

ソリューションエクスプローラ内にコンポーネント追加する項目がありました。

Nugetみたいに入れられる機能がある事に感動。

さっそく 検索欄にAdmobといれてインストール。

そしてドキュメントを開いてみると、設定手順が丁寧に書かれている。

(パーミションとか自動でチェック入れろよとか、思ってはいけません)


設定手順通りに、
PropertiesのAssemblyInfo.csにパーミション追加
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]

AndroidManifest.xmlにAdmobを追加




この辺りはAndroidStudioと同じ方法。

あとはUIに広告を追加すれば完成。

UIのファイルはResource¥Layoutフォルダ内のMain.axmlファイルになります。
ダブルクリックで開くと馴染み深いGUIデザイナー画面になります。

さっそくツールボックスの中からAdmobを探してみると、、入ってません。

Getting Startにも書かれていないけど、Google公式にあるAdmob導入するHowToにはやり方が載っているので、そこからXMLタグを抜粋して張り付ける。

XAMLのSourceタブを選択して自前でタグと属性を挿入する。

-------
Layoutの属性に追加
xmlns:ads="http://schemas.android.com/apk/res-auto"

このタグを好きな位置に配置
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id">
   

-------

ここまで設定してふと気づく。
Getting Startだけだと設定が足りてないので、
最初から以下のサイトを見ながら設定した方が早いです。

https://developers.google.com/admob/android/quick-start#give_your_app_an_ad_unit_id


一通り済んだから、ビルド実行。

。。。。。


あれ?

User code size, 2702336 bytes, is larger than 131072 and requires aツBusinessツ(or higher) License. android1
Using type `Android.Runtime.JNIEnv` requiresツBusinessツ(or higher) License. android1


なにこれ!Visual Studio Update1だから?

ライセンス開放してくださいよー(切実)

Update2にアップデートすれば可能なんだろうけど、今家の回線が0SIMで繋いでるのでアップデートできません。。

ってことで、いつかのアップデートで対処されるんだろうけど今回はこんな切ない終わり方で終了します。

後日、家の固定回線が使えるようになったときにでもUpdate2にしたときどうなったかを追記します。


次回へ続く。

[Xamarin]VSユーザーからみたXamarin入門(1)

今回は触りだけ。
新規プロジェクトで出来たプロジェクトをビルドしてAndroidスマホでデバッグするまでをやってみたいと思います。


Step1.新規プロジェクトからAndroid→Blank App を選択していつものようにプロジェクトを立ち上げる。


Step2.ソリューションエクスプローラから作ったプロジェクトのプロパティを開いて、新しい項目に着目する。


コンパイラのバージョン設定とかターゲットのAPIバージョンの設定




パッケージ名とパーミションの設定



アンドロイドの固有設定(1)




アンドロイドの固有設定(2)

アンドロイドの固有設定(3)


所感、アイコンの設定やマニフェストの設定、ビルドに関する設定があるようだ。
細かい設定は分からなくてもそのままビルドすれば実機で動くので、ひとまず必要になった時に調整していくことにする。


Step3.実機をUSB接続した状態であとはF5ボタンを押すとデバッグが開始させる。

 Hello worldは以上!



コード書かずに実機でHello worldまで進める事が出来ました。



ついでにソリューションエクスプローラの中をみていくと

フォルダ構成はAndroid Studioとかなり似た構成になっているようです。

ざっくり説明すると

Assetsはメディアファイル関係

Resource内
 Drawableに画像関係
 Layoutに画面レイアウト
 Valuesに文字列などの情報

1つ気になったのは、異なるアイコンサイズ事にアイコンを作らなくていいの?っていう点。
まあ、設定項目がないんだから今のところ開発環境がうまいことやってくれるんだろうって思ってる。(希望)



まとめ
・ほぼ今までと同じ操作でXamarinが使える事。

・GUI周り、フォルダ構成、プロジェクト構成、この部分はAndroid依存要素があるので新たに覚える必要がある。


2016年3月9日水曜日

[RaspberryPi]日本語が文字化けした時の対処方法+Chromiumのインストール


1.Raspi-configの設定
 「Innternnatiolisation Options」
   ↓
 Change Locale
   ↓
 ja_JP.UTF-8をチェックしてデフォルト言語に選択


2.日本語化アプリのインストール
$ sudo apt-get install -y ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname uim uim-anthy jfbterm


3.Chromiumをインストール
$ wget http://launchpadlibrarian.net/199573270/chromium-browser_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb
$ wget http://launchpadlibrarian.net/199573282/chromium-codecs-ffmpeg-extra_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb
$ wget http://launchpadlibrarian.net/199573279/chromium-codecs-ffmpeg_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb
$ wget http://launchpadlibrarian.net/199549151/chromium-browser-l10n_41.0.2272.76-0ubuntu0.14.04.1.1076_all.deb

$ sudo dpkg -i chromium-browser_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb chromium-codecs-ffmpeg_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb chromium-codecs-ffmpeg-extra_41.0.2272.76-0ubuntu0.14.04.1.1076_armhf.deb chromium-browser-l10n_41.0.2272.76-0ubuntu0.14.04.1.1076_all.deb




参照URL
http://start-now.link/100/archives/1930

2016年3月8日火曜日

[RaspberryPi]VPNServerを立てる

VPNサーバーとは
 外部から安全に特定のネットワークへアクセスするサービスを提供するサーバーの事です。

どういう時に導入するの?
 外から自宅のネットワークにアクセスしたい時などは直接複数のポートを開けば良いのだが
セキュリティーホールは開いたポート先のサービス毎に存在することになるので管理が大変だが
VPNサーバーを立てると、外から見えるのはVPNサーバーのポート1つだけになるので
セキュリティーホールはVPNサーバー1つだけとなり、管理がしやすく安全になります。


導入手順
 1.SoftEtherをダウンロードする。


 にアクセスして、

  SoftEhter VPN(Freeware)
   ↓
  SoftEhter VPN Server
   ↓
  Linux
   ↓
  ARM EABI(32bit)

  を選び、最新イメージのダウンロードURLをコピーする。

  $ wget http://jp.softether-download.com/files/softether/v4.19-9605-beta-2016.03.06-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.19-9605-beta-2016.03.06-linux-arm_eabi-32bit.tar.gz
    $ tar zxf softether-vpnserver-v4.19-9605-beta-2016.03.06-linux-arm_eabi-32bit.tar.gz
    $ cd vpnserver


 2.コンパイルする。
    $ sudo make

    ~ライセンスについて聞かれるので承諾する。~


 2.起動時に実行するように設定する。
  まずはvpnserverをシステム側に移動させる
    $ cd ..
    $ sudo mv vpnserver /usr/local/
    $ cd /usr/local/vpnserver
    $ sudo chmod 600 *
    $ sudo chmod 700 vpncmd
    $ sudo chmod 700 vpmserver

  次に起動に必要なファイルを作成
    $ sudo vim /etc/init.d/vpnserver
#!/bin/sh
### BEGIN INIT INFO
# Provides:                     vpnserver
# Required-Start:               $local_fs $network
# Required-Stop:                $local_fs $network
# Default-Start:                2 3 4 5
# Default-Stop:                 0 1 6
# Short-Description:            SoftEther VPN 1.0 RC2
# Description:                  Start vpnserver daemon SoftEther VPN 1.0 Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

. /lib/lsb/init-functions

test -x $DAEMON || exit 0

case "$1" in
start)
sleep 3
log_daemon_msg "Starting SoftEther VPN 1.0 Server" "vpnserver"
$DAEMON start >/dev/null 2>&1
touch $LOCK
log_end_msg 0
sleep 3

;;

stop)
log_daemon_msg "Stopping SoftEther VPN 1.0 Server" "vpnserver"
$DAEMON stop >/dev/null 2>&1
rm $LOCK
log_end_msg 0
sleep 2

;;

restart)
$DAEMON stop
sleep 2

$DAEMON start
sleep 5

;;

status)
    if [ -e $LOCK ]
    then
        echo "vpnserver is running."
    else
        echo "vpnserver is not running."
    fi
;;
*)

echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0


    $ sudo vim /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

    $ sudo chmod +x /etc/init.d/vpnserver
  $ sudo systemctl start vpnserver
  $ sudo systemctl enable vpnserver


 3.ブリッジする
  $ sudo apt-get install bridge-utils
    $ sudo vim /etc/network/interfaces
# loopback
auto lo
iface lo inet loopback

# Ethernet port
auto eth0
iface eth0 inet manual

# Bridge interface
auto br0
iface br0 inet dhcp
bridge_ports eth0

#その他
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp


 4.再起動して自動起動しているか確認する。
    $ sudo reboot
    $ sudo service vpnserver status


 5.外からアクセスできるようルータ側の設定を行う
   SoftEhterは
          TCPの449と2222
          UDPの500と4500
   を使うのでポートを開けておく。


参考URL


2016年3月4日金曜日

[RaspberryPi]Asteriskを使う(3)Systemdで起動設定編

Jessieだとinitではなくsystemdになっていてインストール時にサービス登録されているのかな?って調べてみると登録されていなかった。。

ということで起動時にasteriskが立ち上がるように設定する事にした。


参考にしたサイトはここ。

http://www.voip-info.jp/index.php/BeagleBone_Black_Asterisk


$ cd /etc/systemd/system
$ sudo vim asterisk.service
---
[Unit]
Description=Asterisk Open Source PBX
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/asterisk -U asterisk -G asterisk

[Install]
WantedBy=multi-user.target
---


$ sudo ln -s /usr/lib/systemd/
$ sudo ln -s /usr/lib/systemd/
$ sudo ln -s /lib/systemd/system/asterisk.service /etc/systemd/system/multi-user.target.wants/asterisk.service
$ sudo systemctl enable asterisk
$ sudo systemctl start asterisk


再起動して以下のコマンドで動作しているか確認。
ps -ef|grep asterisk
systemctl|grep asterisk

Androider