1ss178の考察

定本トランジスタ回路の設計をすすめる。
1ss176(ショットキーバリアダイオード)の代替品を探した。
google先生に頼んだら秋月の1ss178が見つかった。

176~178は同じ?っぽい。違うのは最大定格。使用の際は、圧倒的に最大定格を下回っているので、大丈夫。

If-Vf図を見ると、100mAでVfが0.9V。本に書いてあるのは0.01mAなので、10^-2A@25℃であるので、Vfは0.4V?。まぁダイオードを入れないよりかはマシかなとは思う。これは実験してみたい項目だなぁと思った。
逆電流も考える必要は特にない。今回の回路は。

今回のダイオードは、電圧を無理やり下げるために用いている。

ちょっとしたメモでした。

poj3280 cheapest palindrome

区間DPらしい。 蟻本の練習問題。 基本的なDPって書いてあったのに、できなかったけど()

普通に文字列周りの問題が壊滅的にできないと思った。全然できんし。

これがわかってたらという事柄をあげる

  • 全探索の方向
  • 最小条件のクリア

eagletmt.github.io

解答はこの方のを見れば、かなりわかりやすいと思う。

全探索の方向

"abcdef"という文字列があった時、この問題の場合は、c, bc, cd, bcd, abcd, bcde, abcdeっていうのを先頭からやっていく感じだった。わかんなかったな〜

最小条件のクリア

これは、リンク先の解説に書いてあるんだけど、"abcba"というのがあって、cをみたとき、bcを回文にするには、cの左を消すか、bを右に新たに付け足すという動作をすることになって、結局それのどちらがコストが小さいのかというと付け足すコストと消すコストの小さい方になる、このことは、具体的にメモしないとわかんなかったな。もちろんすでに左右対称ならコストは0になる。

区間DPできるようになりテェな

djangoの時間まわり

以前に、djangoのコードからローカライズされた時間を取得する方法をやったけど、それを含めて整理する。

まず、プロジェクトを立ち上げた時、時間まわりの設定は、

TIME_ZONE = 'UTC'
USE_TZ = True

になっている。

djangoのコード内で、日付時間を取得する場合は、以下の二つ?

  • datetimeモジュール
  • django.utils.timezoneモジュール

この状態で、とりあえず今日の日付と時間を取るならば、

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2019, 3, 13, 19, 45, 1, 21127, tzinfo=<UTC>)
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2019, 3, 13, 19, 45, 15, 660571)

になる。この場合は、TIME_ZONEとUSE_TZの影響で同じ出力になった。

次に、

TIME_ZONE = 'Asia/Tokyo'

に変えると

>>> from django.utils import timezone
>>> print(timezone.now())
2019-03-13 19:43:00.744599+00:00
>>> from datetime import datetime
>>> print(datetime.today())
2019-03-14 04:43:23.253193

datetimeモジュールだけTIME_ZONEの影響を受ける。

だから、基本的に、時間取得なら設定を変えてdatetimeモジュールを使用する?

じゃあ、timezoneは何に使うんだよっていう話になる。

これは、憶測だけど、憶測だけど、憶測だけど、テンプレートを通して取得した場合にのみ使用するのかもしれない。 上のは、manage.pyのshell。

タイガーブック(3)

ml-lexのレキサーを書いていた。

github.com

この方のがとてもわかりやすいと思う。 これの 2 章。

tiger.lexを書く。

%s COMMENT

正確には%stateらしい。

COMMENTという状態をあらかじめ定義しておく。

var type function break of end in nil let
do to for while else then if array
:= | & >= > <= < <> = / * - + { } ( ) [ ] . , ; :
abcdefg
12345
"ABCDEFG"
/* comment has started */

こんな感じのtiger(作るプログラミング言語の名前)のソースコードらしきものを用意しておく。

tiger.lexを修正して、

% sml
Standard ML of New Jersey v110.85 [built: Sat Dec 22 16:51:02 2018]
- CM.make "sources.cm";
略
- Parse.parse "test.tig";
VAR   2
TYPE   6
FUNCTION   11
BREAK   20
OF   26
END   29
IN   33
NIL   36
LET   40
DO   44
TO   47
FOR   50
WHILE   54
ELSE   60
THEN   65
IF   70
ARRAY   73
ASSIGN   80
OR   83
AND   85
GE   87
GT   90
LE   92
LT   95
NEQ   97
EQ   100
DIVIDE   102
TIMES   104
MINUS   106
PLUS   108
LBRACE   110
RBRACE   112
LPAREN   114
RPAREN   116
LBRACK   118
RBRACK   120
DOT   122
COMMA   124
SEMICOLON   126
COLON   128
ID(abcdefg)     130
INT(12345)   138
STRING("ABCDEFG")     144
skipping comment
skipping comment c
skipping comment o
skipping comment m
skipping comment m
skipping comment e
skipping comment n
skipping comment t
skipping comment
skipping comment h
skipping comment a
skipping comment s
skipping comment
skipping comment s
skipping comment t
skipping comment a
skipping comment r
skipping comment t
skipping comment e
skipping comment d
skipping comment
EOF   179
val it = () : unit

これで字句解析ができてそうなことを確認できた。 tokens.smlに関数は、定義されているので、tiger.lexを完成させればいいだけ。

ESP-IDFでLチカした

ESP-IDFのexamplesに入ってるblinkを見て動かした。

FreeRTOSのドキュメントを見る。

gpio_pad_select_gpio( uint8_t gpio);

gpioをGPIOに設定する?0~0x27までらしい。 blink.cだとデフォルトだとIO5番が渡されている。

gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
gpio_set_level(BLINK_GPIO, 1);

で方向と電圧レベルを変えている。

電流は出しすぎると、容量が足りなくなるかもしれなかったので、低めで試した。

LED周りの計算

電源はhighのとき3.3V、LEDの標準電流は30mAほどで、電圧降下は1.9Vなので、 抵抗は46.7Ωだけど、近くにあったのが、100Ωだったので、100Ω(誤差+-5%)で行なった。 100Ωにすると、14mA。半分くらいになる。電力も1/4Wも大幅に下回るし大丈夫だと思う。

なんなら270Ωでも十分明るいと感じた。 測定値もだいたいあってたしおっけい。

f:id:b1u3:20190311011816j:plain

ESP-IDFでhello worldした

esp-wroom-32はarduino studioでしか使ったことがなかったので、esp-idfでやって見ようかなと思ったので、やった。

基本的に

docs.espressif.com

ここを進めた。

その際に起こったことを記録する。

FLAGSのエラー

まず、環境変数に、FLAGS関連の環境変数が設定されていると、

make flash

で、

/Users/b1u3/esp/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/5.2.0/../../../../xtensa-esp32-elf/bin/ld: cannot find crt1-sim.o: No such file or directory
/Users/b1u3/esp/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/5.2.0/../../../../xtensa-esp32-elf/bin/ld: cannot find _vectors.o: No such file or directory
/Users/b1u3/esp/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/5.2.0/../../../../xtensa-esp32-elf/bin/ld: cannot find -lsim
/Users/b1u3/esp/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/5.2.0/../../../../xtensa-esp32-elf/bin/ld: cannot find -lhandlers-sim
/Users/b1u3/esp/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/5.2.0/../../../../xtensa-esp32-elf/bin/ld: cannot find -lhal
collect2: error: ld returned 1 exit status
make[1]: *** [/Users/b1u3/esp/hello_world/build/bootloader/bootloader.elf] Error 1
make: *** [/Users/b1u3/esp/hello_world/build/bootloader/bootloader.bin] Error 2

これは、環境変数にFLAGS関係の変数(LDFLAGS, CPPFLAGS)が設定されていることに起因しているので、消すなり、実行時だけ追加されるようにするのがいい。project.mkに?=が使われてるからだと思う。

monitorのエラー

make monitor

すると、

MONITOR
--- idf_monitor on /dev/cu.SLAB_USBtoUART 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

Traceback (most recent call last):
  File "/Users/b1u3/Develop/esp/esp-idf/tools/idf_monitor.py", line 743, in <module>
    main()
  File "/Users/b1u3/Develop/esp/esp-idf/tools/idf_monitor.py", line 668, in main
    monitor.main_loop()
  File "/Users/b1u3/Develop/esp/esp-idf/tools/idf_monitor.py", line 337, in main_loop
    self.handle_serial_input(data)
  File "/Users/b1u3/Develop/esp/esp-idf/tools/idf_monitor.py", line 391, in handle_serial_input
    if self._output_enabled and (self._force_line_print or self._line_matcher.match(line)):
  File "/Users/b1u3/Develop/esp/esp-idf/tools/idf_monitor.py", line 256, in match
    m = self._re.search(line)
TypeError: cannot use a string pattern on a bytes-like object
make: *** [monitor] Error 1

というエラーが出る。 v3.1.3だと、idf_monitor.pyにエラーが出る。これはgithubからupstreamの物をそのままコピペして、内容を入れ替えると回避できる。

github.com

回避すると動く

f:id:b1u3:20190307002353j:plain
esp-idfのmonitor

タイガーブック(1)

コンパイラを作りたいのであれば、チャプター2からやればいい?って感じ。githubとかに完成品がたくさんゴロゴロ転がっているので、困ったらそれを見ればいいみたいな。

ちょっとずつ指針を書いていって実装していこうかなって思ってる。

チャプター2では、字句解析器の実装。 タイガーブックだと字句解析器ジェネレータとして、ML-Lexを使っている。

一応、字句解析器というのは、トークンに分ける作業のこと。

123+123;

こういう入力があった時に、123は数字で、+は"足す記号"、123は数字、;はセミコロンというように、順次認識してく過程。

この章は、ML-Lexの書き方をちゃんと理解するような章かな。 アルゴリズム実装はない感じがした。 いじるのは、配布されているディレクトリのchap2/tiger.lex。

ここに書いて、CM.make "sources.cm";して、parseして、、、っていうのをやって、字句解析過程を進めていく。わかんないとこは調べながら。

やっぱ完成品を理解していく方が早いな^^

golangインタープリタ実装だと、フロントエンドも自分で書いてたので、ツールの使い方の勉強だと思えばまぁ楽しいのかな。