woshidan's loose leaf

ぼんやり勉強しています

StoryBoardを使わない方法 at Swift

qiita.com

上記の記事をSwiftでやりました、というお話です。

f:id:woshidan:20170120010246p:plain

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        // refs. http://qiita.com/shou1471/items/637f7500698c3c5b0bc0
        // UIWindowの生成
        self.window = UIWindow.init(frame: UIScreen.mainScreen().bounds)
        self.window?.backgroundColor = UIColor.greenColor() // Storyboardで作成したwindowは通常白背景なので区別するため
        
        // 最初に表示されるViewControllerを生成
        let viewController = ViewController()
        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()
        return true
    }

f:id:woshidan:20170120010355p:plain

Android StudioのEditorのフォントの色を編集する

~~ の箇所はIDE上に警告でません?

というようなことを一ヶ月で3回くらい言われて、 「あ、これ、普通に気付いてない。注意以前に見えてない」ということで、警告を目立つ色で表示させるために調べた。

f:id:woshidan:20170117000426p:plain

  1. メニューの「Android Studio > Preferences」から「Preferences」のメニューを開いて「Editor > Colors & Fonts」を選択
  2. 今回は言語関係なしの警告やコメントの文字色を変更したいのでGeneralを選択
  3. デフォルトで用意されているフォント設定は変更できないので、カスタム用の設定ファイルを「Save As ...」から作成
  4. 色を変更したい箇所をクリックするか、上の方の項目名を選択
  5. 色を変更したいプロパティを選択して、背景色なり、下線の引き方なりを変更してもう一回「Save As ..」を押す

と、警告が超目立つ色になってくれます。

f:id:woshidan:20170117001431p:plain

これで見落としが減ればいいですね。

本当はLintか特定のコードブロック弾いてくれる機能が欲しいんだけど、それはまた今度。

C言語の値渡しとアドレスを知る引数、配列のアドレスについて

C言語の関数の引数はすべて値渡しだそう。

関数の中で、引数で渡された構造体などの中身を変更したい時は、&演算子でその変数のアドレスを求めて、そのアドレスを値渡しで渡す。 そして、関数の中でアドレスに対応するメモリの値を書き換えることで、&演算子をつけて渡された変数の中身を書き換える。

C言語を読んでいく時は、配列名が配列の0番目の要素の変数のアドレスを指していることを合わせて読んでいくと理解しやすいかも。

char str[256]:
scanf("%s", str);
// これは上記と同じ
scanf("%s", &str[0]);

また、配列の各要素のアドレスは、配列の型が取るバイト数だけずれた連番になるそうで、array[n]は、配列名のアドレス + 要素番号 * 1要素分の大きさのアドレスがさすメモリから参照できる変数をさしていることになるそうで。

int array[10];
&array        2345678
&array[0]   2345678
&array[1]  2345682
&array[2]  2345686

苦しんで覚えるC言語

苦しんで覚えるC言語

数学ガール6章まで読んだ

  • 定数はa, b, c... 変数は x, y, z... が多い
  • 相加相乗平均の例、a=+2, b=-2だと絶対値が同じな特殊なケースなのでは、と思ってb=-1にして計算したりした
  • 離散的な世界での差分 <=> 連続的な世界での微分
    • 差分を求めるために下降階乗冪を使うのが計算の都合上にしか見えなくてよくわからない
    • h->0の極限つけて(x-0)(x-h)(x-2h)(x-3h)... としていく所は納得できるけど、h->1で使っていいというのは計算の都合なのかもしれない(元々のxのn乗からの差分の差が10n違わないだろうか的な意味で納得いかない)
      • 計算しやすい

蟻本の1-6の続き

のーみそこねこね。

  • 衝突して折り返していく -> 蟻を区別しなければ、蟻全体の動きとしては、そのまま進んでいく状態と一緒
    • 最短 -> それぞれの位置の蟻が最短で着く方法
    • 最長 -> それぞれの位置の蟻が最長で着く方法
  • 4枚のくじを引いた時、4枚の合計値がmになるか
    • 2枚のくじを引いた時(この組み合わせは2重ループで表現 -> n2)、残りの2枚を引いてこれとの合計値がmになるような値があるか
    • 残りの2枚を引いて合計値がmになるような値この探索は
      • 残りの2枚については、残りの2枚を引いた値の取りうる組み合わせを列挙してその中から(m-最初の2枚)になるものを探す
        • この探す方法は2分探索(binary search) log(n)
    • O(n)に耐えうる必要のある値を入れて必要に応じて変えていくっぽい

2分探索雑に書いた。

n = 4
a = [2, 3, 4, 5, 10]

def binary_search(target, data)
  range_min = 0
  range_max = data.size
  while range_max - range_min >= 1
    i = ((range_max + range_min)/2).to_i
    if (data[i] == target)
      return true
    elsif data[i] < target
      range_min = i + 1
    else
      range_max = i
    end
  end
  return false
end

if binary_search(n, a)
  puts "found"
else
  puts "not_found"
end

蟻本の三角形をrubyで書いた

三角形

n本の棒があります。棒iの長さはa_iです。あなたは、それらの棒から3本を選んでできるだけ周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が作れない際には0を答えとしなさい。

一番大きな辺が他の2つの長さの合計よりも長かったらいけないのですが、

  • 辺を大きい順か小さい順に並べて、大きい方から条件を満たすものを探せばいいのでは?
  • 大きい方から辺を3つ探していったとき、「他の2つの長さの合計が一番大きな辺より大きい」を満たす、一番大きな辺より短い2本の辺って常に一番大きい辺の次とその次に大きい辺なのでは?
    • 未検証... orz

と思って書いた。反例見つかったら修正します。

n = 5
a = [2, 3, 4, 5, 10]
a.sort! # 昇順にソート

if n < 3
  puts "the number of bars is less than 3."
  puts 0
  return
end

def make_triangle(n, a)
  longest_bar_index  = n - 1
  middle_bar_index   = n - 2
  shortest_bar_index = n - 3

  while is_too_long_longest_bar?(longest_bar_index, middle_bar_index, shortest_bar_index, a) do
    longest_bar_index -= 1
    middle_bar_index -= 1
    shortest_bar_index -= 1
    if shortest_bar_index < 0
      puts "cannot make any triangle in this set."
      return 0
    end
  end

  return "#{a[longest_bar_index] + a[middle_bar_index] + a[shortest_bar_index]}(#{a[longest_bar_index]}, #{a[middle_bar_index]}, #{a[shortest_bar_index]} の3本を選んだ時)" unless shortest_bar_index < 0
end

def is_too_long_longest_bar?(longest_bar_index, middle_bar_index, shortest_bar_index, a)
  a[longest_bar_index] >= (a[middle_bar_index] + a[shortest_bar_index])
end

puts make_triangle(n, a)

mp4ヘッダーのボックスとは

mp4 ヘッダー でぐぐったらボックスって出てくるのですが

refs. http://matsu623a.blogspot.jp/2013/12/mpeg4ftyp.html

mp4 ヘッダー ででてくるのは引用元が少なくてあれなのですが、

  • だいたいファイル冒頭にあるファイルのメタデータ持ったバイト群およびハッシュなどの類
  • mp4の場合、ファイル形式がボックスで構成されており、ボックスの中でもヘッダーと呼ばれる部分があるのでややこしく感じる

という認識で良さそう。

そのボックスとはなんぞや

refs. https://unoh.github.io/2007/09/12/mp43gpp3gpp2.html

MP4や、その派生である携帯電話向けの3GPP3GPP2などのファイルフォーマットはボックス(あるいはその基になったQuickTimeでの用語のAtom)と呼ばれるデータブロックで構成され

 

ボックスによってはその内部にさらにボックスが入れ子になるツリー構造になっています

 

各ボックスはその先頭8バイト(オクテット)がボックスを識別するためのヘッダで、最初の4バイト(オクテット)がボックスのサイズ、続く4バイトがそのタイプです。

  • 動画を表すmp4や3gppなどのファイルフォーマットはボックス単位で構成
  • ボックスはボックスの大きさ + ボックスのタイプの部分がボックス識別用のヘッダから始まる
  • ボックスはボックスの大きさの部分で宣言した大きさの分だけ続く。入れ子の場合は入れ子になったボックスの分の大きさも親側のボックスが宣言する(っぽい((いつかまた調べる)))
    • cf. moov以下にmvhdなどがあるが、moovの大きさはこれを含んでいると思われる
  • ボックスの種類(一部)
    • ftyp
      • そのファイルが準拠している規格を表す4文字の「ブランド」が列挙
      • 一番良く使われる形式 ... 4バイト ... それ以外に利用可能な形式 の順で並ぶ
    • moof
      • 3gpp2用のボックス
      • HTTPストリーミングを想定したもので、文字通りデータを分割し小分けに受信することで、全データのダウンロードを完了しなくても再生が開始できるというもの (参考ページより引用まま)
  • mp4box, mp4dump などのツールで確認可能