いろいろ作るよ

IT、電子工作、裁縫

数学やりなおし(1)

読んでいる本


線形代数ってなんぞや?、という人でもスッと入れる良書です。
amzn.asia

理解度の目標としては、演習をクリアすることです。
まずはそこから頑張ります。

行列の計算

行列の足し算、引き算

整数の足し算が分かればできます。

足し算

\[
\left(
\begin{array}{cc}
a & b \\
c & d
\end{array}
\right)
+
\left(
\begin{array}{c}
x & y \\
z & o
\end{array}
\right)
=
\left(
\begin{array}{l}
a + x & b + y \\
c + z & d + o
\end{array}
\right)
\]

引き算

\[
\left(
\begin{array}{cc}
a & b \\
c & d
\end{array}
\right)
-
\left(
\begin{array}{c}
x & y \\
z & o
\end{array}
\right)
=
\left(
\begin{array}{l}
a - x & b - y \\
c - z & d - o
\end{array}
\right)
\]

行列同士の掛け算

これは今までスラスラいってきたのと異なり少し混乱するかもしれない。
ひとつづつの要素ごとでかけていくのか?と思いきや
下のように計算していきます。(n×m行列)、(m×o行列)があった場合、mの値が同じでないと掛け算ができません。


\[
\left(
\begin{array}{cc}
a & b \\
c & d
\end{array}
\right)
\left(
\begin{array}{cc}
e & f \\
g & h
\end{array}
\right)
=
\left(
\begin{array}{l}
ae + cg & af + ch\\
be + dg & bf + dh
\end{array}
\right)
\]

行列には交換法則が成り立たない、ただし・・

行列は交換法則が成り立たない。
つまり

\[
AB \neq BA
\]


ただし2つの行列A B を掛け算するときに左右入れ替えても答えが変わらない行列のことを交換可能、可換という。

\[
AB=BA
\]


行列の割り算

行列は割り算がない。

逆行列についてはまた次の回で記載します。

数学やりなおし(0)

機械学習で出てくる数式を理解したい

機械学習に一歩踏み込むと、必ず数式が出ます。高校生のときに数学ⅢCまで学んだものの、記憶はゼロで数式が出てきた途端ホワイトアウトしてしまうのが常でした。数年まえから縁あって、線形代数の勉強会や高校数学の勉強会に出席させていただいているうちにまた数学への興味が出てきました。これを機にPRMLに出てくる数式が分かるようになるまで頑張ります。

投稿理由は心が折れないために

今回はまた1年ほどブランクがあるため、基礎からやり直します。独学なので、心が折れないようにここに進捗を投稿していこうと思います。

私の前提数学

数Ⅰ、Ⅱ、A、Bは多分覚えています。
数Ⅲ、Cはやばいです。

数式をはてなブログで使うために

表記はLaTexで、MathJaxを使います。
はてなブログのサイドバーにscriptを埋めて使えるようにします。
ある意味はてなブログを改造するため、自己責任にてお願いいたします。

MathJax

以下を参考にさせていただきました。
ksmakoto.hatenadiary.com

joker.hatenablog.com

LaTeXコマンド

www.latex-cmd.com

設定後

¥(¥alpha¥) ---> \(\alpha\)

SHIROBAKO adventar ~どんどんLED~

SHIROBAKOのadventarに参加させてもらいました!!!

www.adventar.org

SHIROBAKOとわたし

SHIROBAKO、言わずと知れた2015年神アニメです。モノづくりに関係した仕事であれば、他人事ではないあるあるの話がたくさんでてきて・・涙なしには見れません。主人公の成長を通して、自分の過去も顧みたりしてとても感慨深いアニメです。

木下監督は理想のプロダクトオーナーだなあ

最終的に良いプロダクトを完成させている点、納期に間に合っている点においてSHIROBAKOのチームは本当にいいチームだと思います。得に私はいつも思いますが監督と一緒に働きたいなあと思ってます。自分の理想をガンとして持っていて(時にはそれがめんどくさいこともあるけど)主張してくれる、そういう人の意見をヒアリングしながら、マッシュアップしていくような職場が理想。なかなか監督はレアな存在ですよね!

で、何をやるか・・ネタは?

POV(LEDの残像で文字を表示するやつです)作ってで"ドンドン" って表示させて、ドーナツ!2015お疲れ様でしたー!って占めたかったんですよ。個人的に2015年はArduinoにはまった年だったので、それを使ってやりたかった。

万策つきたぁーーー。IDEのバージョン上げたらAVR書き込みができなくなった。

いまもう14日ですよ!ArduinoIDEのバージョンを、最近他の基盤(ESP8266)で開発をするために上げたんです。1.0.5系 -> 1.6系に。そしたら!Atmega328に書き込みができなくなって今ですよ。もうね今日は解決できないです。インフルエンザでちょと熱が高いんです。ふんだり蹴ったりです。しかし、配線もPOVのプログラムを作り終わっているのでそれをアップして、後は熱が下がり次第ということで許してください。ごめんなさい。

配線

Arduino互換であるAtmega328を使ったArduino互換機を使って開発してます。
LEDはI/Oピン6~13の8本を使います。

材料はこれです。
Arduino互換と、LED8個、抵抗8本です。

f:id:mikodayo:20151213222401j:plain

配線後は以下です。LEDをそれぞれIOピンに抵抗を介したうえで接続してあげます。

f:id:mikodayo:20151213223237j:plain

POVのプログラム

ダイナミック点灯(常時点灯していると電池消費がすごいので、切り替えを高速でやる手法)を使ってます^-^!基本的にdelayは予期しない動きになって非常に悲しい事態に陥ることがあるので、sleep目的ではTimeroneを使います。当プログラムをIDE上でコンパイルするにはTimeroneのヘッダファイルが必要です。

#include <TimerOne.h>

// common var
// leds
int leds[] = {6, 7, 8, 9, 10, 11, 12, 13};
#define NUMBER_OF_LEDS (sizeof(leds)/sizeof(int))
// menu
unsigned long led = 0;
// wait
unsigned long start = 0;
unsigned long now = 0;
unsigned long elapsed = 0;
// pov
unsigned char pos = 0;
unsigned char i = 0;
// led
#define TIMER_US 100                       // ScanRate (Duration of one LED period) 100mS = uS 100000                        
//unsigned long frames = 0;                 // ++ on every 'frame' of the LED bar
volatile bool LSTATE[8];                  // Desired state for each LED (can use 0 / 1 or LOW / HIGH)
volatile int LDRAW = 0;                   // Which LED are we 'drawing' right now?
//Standard Millis timers
//const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // LED 6,7,8,9,10,11,12,13
  for (led=0; led<NUMBER_OF_LEDS; led++) {
    pinMode(leds[led], OUTPUT);
  }
  // led
  Timer1.initialize(TIMER_US);                  // Initialise timer 1
  Timer1.attachInterrupt( timerIsr );           // attach the ISR routine here
}

// --------------------------
// timerIsr() 1x milli second interrupt ISR()
// Called every time the hardware timer 1 times out.
// --------------------------
void timerIsr()
{
    noInterrupts();                       // temporarilly disable interrupts
    digitalWrite(leds[LDRAW], LOW);   // turn the current LED off
     LDRAW++;                              // move to the next..  
    if (LDRAW >= NUMBER_OF_LEDS){                 // reset to zero if necessary
      LDRAW = 0;
      //frames++;
      LSTATE[7] = LOW;
    }
    digitalWrite( leds[LDRAW], LSTATE[LDRAW]);   // set new current LED state
    interrupts();                         // restart interrupts
}       // get out of the ISR ASAP

void loop(){
  pov();
}

// !!notice!! mydelay can not user inside interrput.
void myDelay(unsigned long ms) {              // ms: duration
  // start: timestamp
  start = millis();           
  for (;;) {
    // now: timestamp
    now = millis();
    // elapsed: duration
    elapsed = now - start;
    if (elapsed >= ms)
      return;
  }
}

// led
//-----------------------------
//----------- common
// all off
void led_off() {
  byte bitmap_led_off[] = {
  0b00000000  
  };
  led_flash_by_order_arry(bitmap_led_off, sizeof(bitmap_led_off)/sizeof(byte),400);
}
// 指定されている配列のみHIGHにして、あとはLOWにする
void led_flash_by_order_arry(byte *array_order, int bitmap_size, unsigned long ms) {

    // first byte big array
    for(i=0; i<bitmap_size; i++){

          start = millis();
          for(;;) {
              now = millis();
            for(led=0;led<NUMBER_OF_LEDS;led++) {      
              LSTATE[led] = (array_order[i]>>led)&0b00000001 ? 1 : 0;
            }
          // check system timer
          elapsed = now - start;
          if (elapsed >= ms)
            break;

          }
      
  }  
}

void pov(){
  // pov
  byte bitmap_pov[] = {
0b00000000,
0b11111110,
0b00010000,
0b00010010,
0b00010100,
0b00000010,
0b00000100,
0b00000000,
0b00010000,
0b00010000,
0b10010000,
0b10000000,
0b01000000,
0b00111110,
0b00000000
  };
  led_flash_by_order_arry(bitmap_pov, sizeof(bitmap_pov)/sizeof(byte),5);
}


来年は・・

もっと体力つけたいです。

ssl_request_logのIP抽出用のawk

cat ssl_request_log | awk '{print $3}' | sort | uniq -c

arudinoに書き込み時、avrdude: stk500_getsync(): not in sync: resp=0x00が出る

私の場合、
IDEメニューツール -> マイコンボード
間違えていました。

avrdude: stk500_getsync(): not in sync: resp=0x00

書き込み失敗するよエラーの模様。

mysqlのタイムゾーンがUTCでapplication.rbのconfig.time_zone=localの場合、date/datetimeをgroupするとタイムゾーンがUTC使われる件

Model.group("date(convert_tz(created_at,'UTC','[your_time_zone]'))").countをやったときに

configに設定しているtime_zoneではなくてUTCで帰ってくる。


対応↓

mysqlで、タイムゾーンの設定が読み込まれているか確認する

↓NULLが返ってきたら読み込む作業を行う必要がある
mysql> select convert_tz(now(), 'UTC', 'Asia/Tokyo'));

                                                                    • +
convert_tz(now(), 'UTC', 'JST')
                                                                    • +
NULL
                                                                    • +

mysql> select convert_tz(now(), 'UTC', 'Asia/Tokyo');

                                                                                  • +
convert_tz(now(), 'UTC', 'Asia/Tokyo')
                                                                                  • +
2015-06-30 22:28:22
                                                                                  • +

1 row in set (0.00 sec)


読み込み作業


convert_tzがnilを返してくる場合shellコマンドラインで、実行
MySQL :: MySQL 5.5 Reference Manual :: 10.6 MySQL Server Time Zone Support
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

warningが出て、そのwarningがでたtime_zoneが必要な場合は要調査。
使わないtime_zoneのwarningなら無視でOK


以下でNULL以外が帰れば、OKconvert_tzが使える。
mysql> select convert_tz(now(), 'UTC', 'Asia/Tokyo');

                                                                                  • +
convert_tz(now(), 'UTC', 'Asia/Tokyo')
                                                                                  • +
2015-06-30 22:28:22
                                                                                  • +

1 row in set (0.00 sec)




↓ありがとうございましたstackoverflow.com

Rails columnカラムの型を取得したい

Driverというテーブル名だったとして、

Driver.columns_hash["name"].type


以下のサイトを参考にさせてもらいました。
stackoverflow.com