Swift入門メモ -if・switch-

08 ifで条件分岐

dotinstall.com

  • 何らかの条件に応じて処理を振り分けたいとき
  • 比較演算子を使う > >= < <= == !=
let score = 62
var result = ""

if score > 80 {
    result = "Great"
} else if score > 60 {
    result = "Good" // ここ
} else {
    result = "so so ..."
}

// 以下のifを三項演算子で書いてみる
if score > 80 {
    result = "Great"
} else {
    result = "so so ..." // ここ
}

result = score > 80 ? "Great" : "so so..."
result // so so...

09 switchで条件分岐

dotinstall.com

  • 何らかの条件に応じで処理を振り分けたいとき
  • case文を区切るのにbreakは必要ない
  • 取り得る値が複数ある場合はカンマ区切り
  • 範囲演算子を使うことが出来る
  • 細かい条件の指定も可能
  • 取り得る値をすべて網羅出来ない場合は、必ずdefault句が必要
  • 何らかの時に何もしたくない場合はbreakと書く
  • 続けて次の処理もしておきたい場合はfallthrough
let num = 8

switch num {
case 1, 2, 4, 8:
    println("tenkou")
    fallthrough // 続けて次の処理をしたい場合
    // num=1,2,4,8の場合は、"tenkou"の後に"mayama"と表示される
case 3:
    println("mayama")
case 5...7: // 範囲演算子:5, 6, 7
    println("yasumoto, hirota, hoshina")
case 9..<11: // 範囲演算子:9, 1011は含まない)
    println("matsuno, kashiwagi")
case let n where n > 10 && n < 13: // 一旦値がnに入り、where句で条件を指定して真の場合に続く処理が実行される
    println("kobayashi, nakayama")
default:
    // println("n.a.")
    break // 何もしたくない場合はbreak
}

Swift入門メモ -タプル・配列・辞書-

05 タプルを使ってみよう

dotinstall.com

  • タプル->複数の値をまとめて渡すときによく使われる
// タプル
let error = (404, "not found")
error.0 // 404
error.1 // not found

// 名前を付ける
let error2 = (code: 404, msg: "not found")
error2.0 // 404
error2.code // 404
error2.1 // not found
error2.msg // not found
  • タプルに対してタプルの値を渡す
let error = (404, "not found")
let (code, msg) = error
code // 404
msg // not found
  • タプルに渡ってくる複数の値のうち、使わないものがある場合は _ で値を安全に破棄することができる
let error = (404, "not found")
let (code, _) = error // "not found"は使わない
code // 404
//msg // エラーになる

06 配列を使ってみよう

dotinstall.com

配列とは

  • 関連性のある複数のデータを1つの変数名でまとめて管理したい場合に使う
// 配列 String型のデータを入れる
var students: [String] = ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]

// 値の取り出し/添字は0から
students[0] // mayama
students[1] // yasumoto

// 値の変更
// ※ 「let students」 の場合は変更出来ない
students[0] = "mizocchi"
students // ["mizocchi", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]

便利な命令

  • 要素の個数を数えるcount
  • 配列が空かどうかを調べるisEmpty
  • 末尾に要素を追加append
  • 任意の位置に入れるinsert
  • 削除removeAtIndex
  • 末尾を削除removeLast
// 配列 String型のデータを入れる
var students: [String] = ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]

students.count // 8
students.isEmpty // false


// 末尾に追加
students.append("karisome")
students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama", "karisome"]
students.count // 9

// 任意の位置に追加
students.insert("mizuki", atIndex: 0)
students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama", "karisome"]
students.count // 10

// 任意の位置を削除
students.removeAtIndex(9) // karisome
students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]
students.count // 9

// 末尾を削除
// 削除すると削除されたものが返される
let lastsamurai = students.removeLast() // nakayama
students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi"]
students.count // 8
lastsamurai // nakayama

// --------------元に戻す
students.removeAtIndex(0) // mizuki (´;ω;`)
students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi"]
students.count // 7
students.append(lastsamurai)
students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]
students.count // 8

空の配列

  • String型の場合はvar emptyArray = [String]()

07 辞書を使ってみよう

dotinstall.com

辞書とは

  • キーと値のペアでデータを管理
// キーをString型、値をInt型で管理
var students: [String: Int] = [
    "mayama": 3,
    "yasumoto": 5,
    "hirota": 6,
    "hoshina": 7,
    "matsuno": 9,
    "kashiwagi": 10,
    "kobayashi": 11,
    "nakayama": 12
]

// 値の取り出し(「Some」はOptionalという考え方。後で)
students["yasumoto"] // {Some 5}

便利な命令

  • ペアの数count
  • 空かどうかisEmpty
  • 値の追加 新しいキーで値を指定
  • 削除removeValueForKey
  • 値の更新 updateValueキーを指定して値を更新
  • キーと値の一覧を配列か何かで取りたいxxx.keys xxx.values
students.count // 8
students.isEmpty //false

// 値の追加
students["suzuki"] = 8
// 順番は保証されてないみたい
students // ["hoshina": 7, "mayama": 3, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "suzuki": 8, "kobayashi": 11, "yasumoto": 5]


// 値の削除
students.removeValueForKey("suzuki") // {Some 8}
students // ["hoshina": 7, "mayama": 3, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "kobayashi": 11, "yasumoto": 5]


// 値の更新

// 元の値が返り値として返ってくる
let number = students.updateValue(1, forKey: "mayama") // {Some 3}
// キーを指定して値を更新することも出来る
// students["mayama"] = 1 // {Some 1}

students // ["hoshina": 7, "mayama": 1, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "kobayashi": 11, "yasumoto": 5]
number // {Some 3}

// キーの一覧を配列で取得
let keys = Array(students.keys)
keys // ["hoshina", "mayama", "kashiwagi", "nakayama", "matsuno", "hirota", "kobayashi", "yasumoto"]

// 値の一覧を配列で取得
let values = Array(students.values)
values // [7, 1, 10, 12, 9, 6, 11, 5]

空の辞書型

  • キーがString型で値がInt型の場合->var emptyDictionary = [String: Int]()

Swift入門メモ -基本データ型まで-

そろそろiPhoneアプリが作れるようになりたくて、Swiftの勉強をやっと開始。

いつもお世話になってるドットインストールでSwift入門があるとのことでプレミアム会員になりました。お金払いました。

以下はそのメモ。
(有料のものをブログに載せるってどうなんですかね。。メモ程度だったらいいのかな。。ほぼそのまま載せてるけど。。ダメだったら教えて下さい)

※3/26追記 ドットインストールのヘルプに明記されていましたので、各レッスンへのリンク追記しました

01 Swiftを使ってみよう

dotinstall.com

Swiftとは

公式サイト

ツール

  • Xcode 6以上
  • Swiftを試したいだけだったら、playgroundで出来る

02 はじめてのSwift

dotinstall.com

Playgroundの使い方

  • 左側にコードを書くと、右側にそれが評価されて表示される
  • 右側には2つアイコンがある
    • 1つ目:Quick Look -> 簡単に値を表示するためのもの
    • 2つ目:Value History -> 詳しい情報が出てくる(後々使う)

はじめてのSwiftプログラム

// println -> 改行付きで文字列を表示
// print -> 改行なしで文字列を表示
// 文字列は 「”」で囲む
// 文末に「;」は付けない
println("Hello Ebichu") // “Hello Ebichu”

// 一行コメント
/* 
複数行コメント
*/

03 変数と定数を使う

dotinstall.com

変数

  • 変数を使う前には宣言
  • varキーワードを使う
  • var 変数名 : データ型
  • 変数の宣言と代入は一度に出来る
// String型の変数msgを宣言
var msg: String

// 変数msgに文字列を代入
msg = "Hello Ebichu!!"

// 変数に代入した文字列を表示
println(msg)

// ——————————

// 変数の宣言と代入を一度に行う
// String型であることがわかっているので型は不要
var msg2 = "Hello EBC"

定数

  • 変更が出来ない変数
  • 変更されると困る値や変更の予定がない値は定数にしていくと安全なプログラムが書ける
  • 定数の宣言はletキーワードを使う
let s = "ebichu"
println(s) //  “ebichu”

// 定数は変更出来ないので以下はエラーになる
// s = "momoclo"

変数・定数の展開

  • 文字列の中で展開して表示することが出来る
  • \(変数名)
var msg: String
msg = "Hello Ebichu"

let s = "ebichu"
println(s)

println("msg: \(msg), s: \(s)") // msg: Hello Ebichu, s: ebichu
  • 展開する変数の型はString以外でもOK
let msg = "Golden"
let num = 8

println("We are \(msg) \(num) !!") // We are Golden 8 !!

04 基本データ型を見ていこう

dotinstall.com

基本データ型

  • 文字列 String “hoge”
  • 整数 Int 5572320
  • 小数点を含む数値 Float/Double 3.14159265358979
    • Float/Doubleの違いは精度。Doubleの方が精度が高い
  • 論理演算 Bool true/false
  • 何もないという意味での nil

演算

  • 四則演算 + - * / %
  • 単項演算子 ++
    • 前につける ++x 、後ろにつける x++
    • 前と後ろで評価の順番が変わる
  • 文字列の連結は +
    • let s = “hello” + “world” -> helloworld
  • 論理演算 && || !
    • true && false -> false
    • true || false -> true
    • !true -> false
  • データ型を変換するconversion
// conversion
let a = "hkt"
let b = 48

// 以下はエラー。文字列型と数値型を連結しようとしているから
// let c = a + b

// 48を文字列型にする
let c = a + String(b) // hkt48

LINEスタンプがやっと承認された!!

勢いで作ったスタンプがやっとこさ承認されたぞー!忘れてたぞー!

作成経緯

  • 会社辞めて暇だった
  • 何しよう
  • LINEスタンプでも作るか!!
  • でも絵描けないしPhotoshopIllustrator使えない・・
  • 手描きの絵でどうにかして作れないかな・・
  • LINEスタンプ 手描き 検索!
  • どんぴしゃな記事に出会う!出来る!

参考

【超初心者向け!!】秒速でLINEスタンプを自作する方法!|合同会社チームサンタ

の記事を参考にして作っていった。
とてもわかりやすく書かれていて参考になりました。ありがとうございます!
絵を描いてスタンプにするのはとても簡単。
スタンプ2040個考えて絵にする時間・気力・体力があれば誰でも作れる。

申請〜承認〜販売まで

細かい日付は残していなかったので曖昧

  • 2014年9月某日
  • 2014年9月23日
  • 2014年11月末日
  • 2015年2月27日
    • LINE Creators Marketよりスタンプ承認のメールが!
    • マイページにアクセスしてリリースボタンをぽちっと
    • 2〜3時間でストアに反映されて購入可能に!

膨大なスタンプが申請されていると思うので、申請から承認まで半年位はかかりそう。
忘れかけてたよね・・・

リジェクトされずに一発で審査が通り、無事にストアに並んでいるので感動しました。
やり切れたので、自分で自分を褒めます。

作成したスタンプ

チュー犬 - LINE スタンプ | LINE STORE

私立恵比寿中学さん大好き大好きという気持ちのまま勢いで作ったもの。
なぜこの名前にしたのか、など殆ど覚えていないが、

  1. 私立恵比寿中学
  2. エビ中
  3. シリツエビチューTシャツあったなぁ
  4. チュー・・・チュー・・・チューケン!忠犬ハチ公
  5. 柴犬にシリツエビチューTシャツっぽいの着せよう!
  6. 字が入らない!チューが限界!
  7. (シリツエビ)チューが大好きな犬
  8. チュー犬!!

こんな感じ。アイドルが好きな柴犬が何かしてるスタンプ

私立恵比寿中学さんとは一切関係ありません。好きなだけです

公式でかわいいスタンプ出してくれないですかね〜
ロボサンのはあるけど・・・

形態素解析&マルコフ連鎖を使って文章をつぶやくTwitter botを作った

Rubytwitter botを作った。構想から完成まで約3ヶ月 何だかんだでものすごく時間がかかってしまった。。。

github.com

どうせなら使ったことのない言語で作りたかったので、Rubyに挑戦してみることに。
gitもまともに使ったことがなかったので、bitbucketでソースコードの管理をしながら作った。
完成するまでの流れを残しておく。

Rubytwitter botを作る方法を調べる

とにかくググる

どうせだったらHeroku使いたい(少しだけ使ったことあるから)

Herokuを使う方法を調べる

とにかくググる

調べていく中で、形態素解析マルコフ連鎖 という言葉を知る。
定期的につぶやくなら、決まった言葉をランダムにつぶやくだけじゃ面白くないので形態素解析マルコフ連鎖を使ってみることに!

形態素解析マルコフ連鎖について調べる

ググる

Mecabを入れてみる

を参考にしてrubyからMecabを使ってみる

require 'natto'

nm = Natto::MeCab.new

nm.parse('今日も100%スマイルサーブ。テニスの王女様。鈴木裕乃です。') do |n|
    puts "#{n.surface}\t#{n.feature}"
end
今日   名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
も 助詞,係助詞,*,*,*,*,も,モ,モ
100 名詞,数,*,*,*,*,*
%   名詞,サ変接続,*,*,*,*,*
スマイル    名詞,一般,*,*,*,*,スマイル,スマイル,スマイル
サーブ   名詞,サ変接続,*,*,*,*,サーブ,サーブ,サーブ
。 記号,句点,*,*,*,*,。,。,。
テニス   名詞,一般,*,*,*,*,テニス,テニス,テニス
の 助詞,連体化,*,*,*,*,の,ノ,ノ
王女  名詞,一般,*,*,*,*,王女,オウジョ,オージョ
様 名詞,接尾,人名,*,*,*,様,サマ,サマ
。 記号,句点,*,*,*,*,。,。,。
鈴木  名詞,固有名詞,人名,姓,*,*,鈴木,スズキ,スズキ
裕乃  名詞,固有名詞,人名,名,*,*,ひろの,ヒロノ,ヒロノ
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 記号,句点,*,*,*,*,。,。,。
    BOS/EOS,*,*,*,*,*,*,*,*

できた!
(鈴木/裕乃にするためにMecab辞書に名前追加してます)

色々調べてなんとなくわかったので、実装の方針が固まる

実装方針決定

  • エビ中さん大好きなのでエビ中さん関連で
  • フォロワーさんのツイート+歌詞の一部を合わせたリストを形態素解析
  • 解析したものをマルコフ連鎖を使って文章組み立て
  • つぶやく&リプライの作成
  • 生徒の名前が含まれていたら、該当生徒がよく使う顔文字(アメブロより拝借)をランダムで付与

と、方針が決まったので実際にコーディング

問題発生and回避

  • Mecabでやろうとしたけど、herokuには入れられない!!
  • okura使う???試してみたけどwakati書きに時間がかかりすぎぃい(やり方が悪い?)
  • 形態素解析は YahooのAPIを使うことに
  • API制限があるが、24時間で50000回制限&1リクエストで100kbだったから大丈夫
  • 1時間に1回ツイートを取得→形態素解析して辞書を作り直す
  • 取得するツイート数は最大600にすれば制限に引っかからない

実装の参考に(ほぼ丸写しに)させて頂いたコードなど

Twitter Streaming APIRubyのクラス分け

形態素解析マルコフ連鎖

Heroku関連

  • branchをHerokuにpushしたい
    • https://devcenter.heroku.com/articles/git

      Branches pushed to Heroku other than master will be ignored by this command. If you’re working out of another branch locally, you can either merge to master before pushing, or specify that you want to push your local branch to a remote master. To push a branch other than master, use this syntax:
      $ git push heroku yourbranch:master

  • ローカルでの動作確認/foreman/.env
    • https://devcenter.heroku.com/articles/procfile

      Config vars saved in the .env file of a project directory will be added to the environment when run by Foreman. For example we can set the RACK_ENV to development in your environment.
      echo "RACK_ENV=development" >>.env

いろいろあったが何とか完成!他のエビ中関連botさんと会話しつつ、全く役に立たないbotは元気に稼働しています。内容は意味不明・・・

キングオブ学芸会bot (@kogakugeeeekai) | Twitter

これお気に入り

参考にさせていただた皆様に感謝!

プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識をやっと読んだ

数年前に買ってちらっと見て本棚の片隅に置いてあったのをやっと読んだ。

まだまだ理解できない部分もあったが、今までこんなことも知らずにプログラマとして働いていた自分恐ろしい((((;゚Д゚))))

読んでよかった。第2版を電子書籍で買ってた事を思い出したよ・・・

第1章 プログラマにとってCPUとはなにか

  • プログラム→コンピュータに実行させる処理の順番を示すもの→命令とデータ
  • プログラムはメイン・メモリに
  • 命令やデータはメモリのアドレスに格納される
  • CPUがプログラムを実行
  • CPU→制御装置+演算装置+クロック信号+レジスタ
  • レジスタ→アキュムレータ・インデックスレジスタ・フラグレジスタ・プログラムカウンタ・汎用レジスタ
  • アセンブリ!!!

第2章 データを2進数でイメージしよう

  • ICのピンは1本で2つの状態を表す
  • 32ビット・マイクロプロセッサは情報を入出力するためのピンを32本持っている!(衝撃
  • 一度に32桁(32ビット=4バイト)の2進数の情報を処理できる!(衝撃
  • シフト演算
  • 補数(よくわかってない
  • 論理右シフト、算術右シフト
  • 論理演算

第3章 コンピュータが少数計算を間違える理由

  • 0.1を100回加えても100にならない(えっ
  • 小数点数を2進数で表すには、整数と同様に重みを掛けて結果を加える(ついていけない
  • 浮動小数点数(もうダメだ
  • 正規表現とイクセス表現(もう許してください

この章は全然わからなかった・・

第4章 四角いメモリーを丸く使う

  • メモリーの実態はICと呼ばれる電子部品
  • アドレスを指定してデータを読み書き
  • アドレスはデータを格納する場所を示すもの
  • メモリーの論理的なイメージはビルディング
  • ポインタ→データの値そのものではなく、データが格納されているメモリーのアドレスを持つ変数のこと。
  • 配列
  • スタック→LIFO(Last In First Out)
  • Push, Pop
  • キュー→FIFO(First In First Out)
  • Put, Get
  • リングバッファ
  • リスト要素
  • 2分探索木(聞いたことある

第5章 メモリーとディスクの親密な関係

  • プログラムは記憶装置に格納されていて順次読み出されて実行される
  • フォン・ノイマン
  • パソコンにおける記憶装置→メモリー、ディスク
  • ディスクに記憶されたプログラムがメモリーにロードされてから実行される
  • ディスクアクセスを高速化→ディスクキャッシュ(メイン・メモリー内の領域)
  • ディスクをメモリの一部として使う仮想記憶→ページング方式、セグメント方式
  • ディスクの物理構造
  • 一般的なパソコンではセクター方式

うーん。

第6章 自分でデータを圧縮してみよう

  • ファイルにはバイト単位で記録
  • ランレングス法(?
  • ハフマン法(???

ここもよく理解できず

第7章 プログラムはどんな環境で動くのか

  • 動作環境 = OS + ハードウエア
  • AT互換機とかx86とか

うーん?

第8章 ソース・ファイルから実行可能ファイルができるまで

10年前の新人研修でC言語の上っ面をかすっただけなので全く理解できず。。。

インタプリタの実行イメージがわからん。

実行時にネイティブコードに逐次変換したネイティブコードがメモリにロードされてから実行されるのかな??

第9章 OSとアプリケーションの関係

流し読み

第10章 アセンブリ言語からプログラムの本当の姿を知る

アセンブリ言語面白かったから、もう少し勉強する(予定

第11章 ハードウエアを制御する方法

  • ハードウエアとの入出力を支えるのはIN命令とOUT命令
  • 周辺装置の割り込み
  • DMA

流し読み

第12章 コンピュータに「考え」させるためには

  • 人間の考え方をプログラムで表す(YES!
  • 人間の癖をプログラムで表す(ほぅ
  • 記憶を生かすことで、より人間らしい判断を行う(なるほど

第2版買っていたのでそっちも読みます。

コンピュータともう少し仲良くなったら今からでも成長できるかな!!!