自分用メモ Rubyで気をつけること

requireとrequire_relativeの違いはファイルパスの起点となる場所の違い。

requireはrubyを実行しているディレクトリが起点になる。relativeはファイルの置かれている場所が起点になる。

 

for文使わない点が独特。配列なんかに対して繰り返せって感じのメソッド呼ぶことで繰り返しを記述する。

 

範囲オブジェクトをデフォルトでサポート

 

rubyがreturnを省略した際に返す値は、rubyvmのスタックに最後に積まれた

 

クラスとは別にモジュールという概念がある。

メソッドをグループ化してクラスに取り込みやすくしたもの

 

新規アプリ作成(vue込み)

rails new todo_sample --webpack=vue

bin/rails g controller home index

 

 

rails5.2系でCSRF対策を無効にするには、application_controller.rbに

protect_from_forgery

を追記。

 

ABC138 解けなかったやつ

C問題が解けない・・・

頂点を最後の配合とする二分木で考える必要があった。

頂点から伸びる2つの葉は、最大の価値を持った具材、それまでの配合で最大となった価値をもつ具材という葉になる。

枝の個数分1/2されていくので、価値の小さい具材から配合して行けば良いことが分かる。

以下AC

n = int(input())

list1 = list(map(int,input().split()))

while len(list1) > 1:

  list1 = sorted(list1)

  v1 = list1.pop(0)

  v2 = list1.pop(0)

  list1.append((v1+v2)/2)

print(list1[0])

ABC137の解けなかったやつC問

アナグラムかどうかの判定問題

文字列の中のアルファベットごとの出現回数を調べる

文字列を辞書順にソートして同じ文字列になればそれはアナグラムである

この2つの方法があり、ひらめくことが出来たが

組の数を数えるところでTLEしてしまった。

この場合はハッシュテーブルを使うのが早いらしい。

pythonでいうdictinaryのこと。

少し面倒なのがdictはキーに対する値が設定されていない場合エラーになる。

そこでキーに対する初期値を与える便利なライブラリがある。

from collections import defaultdict

それが上のやつ。

countDict = defaultdict(int)

みたいに引数に関数を渡すと初期値を設定してくれる。

intはlambda:intという無名関数と同じで0がセットされる。

def func():

      return 10

countDict = defaultdict(func)

みたいにすればキーに対する初期値が10になる。

 

これでACできる。

from collections import defaultdict
N = int(input())
S = [''.join(sorted(list(str(input())))) for i in range(N)]
countDict = defaultdict(int)

ans = 0
for s in S:
ans += countDict[s]
countDict[s] += 1
print(ans)

Django form 画像がアップロードされない。

<form action="" enctype="multipart/form-data" method="post">

だいたい、templateのenctype="multipart/form-data"を書き忘れてる。

 

これで解決しない場合は、

<form action="" method="post" enctype="multipart/form-data">

のようにmethodがenctypeより先にきてる。

僕はこっちの方で詰まってました。

フロントエンド知らないとこういう場所でドン詰まりしてしまうなぁ・・・

 

割り込みがうまくいかない。

キーボード割り込みのみを有効にした状態で、キーを押すと以下の画像のように

一瞬画面がおかしくなり、正常な関数が呼ばれない。

本来、呼ばれるはずの関数ではCLI命令(CPUレベルで割り込みを禁止する命令)が呼ばれるため、それ以降、割り込み自体が起こらなくなるはずなのに相変わらずキーを押すたびに画面がおかしくなるのでおそらく呼ばれるはずの関数は呼ばれていないと考えた。

f:id:m011501945:20190611024201g:plain

割り込み発生時

割り込みは、GDTとIDTの設定が間違っていなければ少なくとも割り込みベクタ番号に対応した関数は呼ばれるはずである。

そこでデバッグをした軌跡を以下に続ける。

まずqemuでGDTRレジスタとIDTRレジスタにどんなアドレスが入っているか調べた。

f:id:m011501945:20190611024959p:plain

GDTとIDTが設定されている。

GDTは0x1041a0、IDTは0x104200というアドレスが設定されていることが分かる。

まずはGDTから見てみる。

f:id:m011501945:20190611025140p:plain

GDTのアドレスからバイナリダンプ

1041a0からの8バイトはnullディスクリプタ、続いての8バイトがカーネルのコードディスクリプタ、その次の8バイトがカーネルのデータディスクリプタである。

カーネルのコードディスクリプタはベースアドレス0で大きさが0xffffである。

つまりメモリ全体をコードディスクリプタとしている。データセグメントも同様。

おかしいところは無いように思う。

4つ目は気にしないで頂きたい(デバック中の名残)

 

次はIDTを見てみる。

f:id:m011501945:20190611025735p:plain

IDTのバイナリダンプ

0x104200からIDTは始まっているが、そこは割り込みベクタ番号0から31までの設定なので気にしなくて良い。

割り込みベクタの32番の設定が104300から8バイト、33番の設定が104308から8バイトでされている。

32番はタイマ割り込み、33番がキーボード割り込みである。

今は、キーボード割り込みしか受け付けないようにしているため32番は気にしなくて良い。

セグメントセレクタは0x08、つまりカーネルのコードディスクリプタを指している。

33番の設定をみると割り込みハンドラは0x100938をコールするようになっている。

f:id:m011501945:20190611030501p:plain

0x100938の関数

上の画像はカーネルマップで見た0x100938に配置されている関数である。名前がタイマ割り込みとなっているが、実際はCLIする関数である。

本当に困った。

私の目からはちゃんと設定されているようにしか見えない・・・。

他にどのような原因があるでしょうか?

もしかしたらここが変な可能性あるとか思いついた方いましたらご教授お願いします・・・。

f:id:m011501945:20190611031449p:plain

そのほかの情報

上の画像ではちょっとGDTとIDTが変わってしまっているが多分問題ないです。

コンパイルしたらちょっと変わっただけです。

またコンパイルは-O2というオプションで最適化してコンパイルしている。

 

 

以下は使っているリンカスクリプト

SECTIONS
{
. = 0x100000;
.text :
{
_text_start = .;
*(.text)
_text_end = .;
}

.rodata :
{
_rodata_start = .;
*(.rodata)
_rodata_end = .;
}

.data :
{
_data_start = .;
*(.data)
_data_end = .;
}

.bss :
{
_bss_start = .;
*(COMMON)
*(.bss)
_bss_end = .;
}
_end = .;
}

自作OSでの謎(メモリマップ取得)

0xe820機能でメモリマップを取得するとbiosがメモリの予約領域やフリー領域を教えてくれるが、そのメモリマップは連続ではない。(一部は連続してたりする)

例えば、取得するマップの1要素目のベースアドレスが、0x0で長さが0x100 だとしよう。 2要素目のベースアドレスは0x100で長さが0x200だとしよう。

これはメモリの領域が連続している。

初めは0番地から100番地分の情報をくれたので、次は100番地から200番地分の情報を教えてくれた。ここまでで、0番地から300番地までの情報を知ることができた。

次の3要素目は300番地から何番地分の情報を教えてくれるのかなーと期待していると

急に500番地から100番地分の情報を教えてきたりする。

300番地から500番地までの200番地分のメモリ空間は一体なんなのだろう

とりあえず物理メモリ管理では予約領域として使えないようにしておいたが・・・

あの領域は何なのか知っている人いれば教えて頂けると嬉しいです。