Swift入門メモ -if・switch-
08 ifで条件分岐
- 何らかの条件に応じて処理を振り分けたいとき
- 比較演算子を使う
> >= < <= == !=
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で条件分岐
- 何らかの条件に応じで処理を振り分けたいとき
- 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, 10(11は含まない) println("matsuno, kashiwagi") case let n where n > 10 && n < 13: // 一旦値がnに入り、where句で条件を指定して真の場合に続く処理が実行される println("kobayashi, nakayama") default: // println("n.a.") break // 何もしたくない場合はbreak }
Swift入門メモ -タプル・配列・辞書-
05 タプルを使ってみよう
- タプル->複数の値をまとめて渡すときによく使われる
// タプル 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 配列を使ってみよう
配列とは
- 関連性のある複数のデータを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 辞書を使ってみよう
辞書とは
- キーと値のペアでデータを管理
// キーを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を使ってみよう
Swiftとは
公式サイト
ツール
02 はじめてのSwift
Playgroundの使い方
- 左側にコードを書くと、右側にそれが評価されて表示される
- 右側には2つアイコンがある
- 1つ目:Quick Look -> 簡単に値を表示するためのもの
- 2つ目:Value History -> 詳しい情報が出てくる(後々使う)
はじめてのSwiftプログラム
// println -> 改行付きで文字列を表示 // print -> 改行なしで文字列を表示 // 文字列は 「”」で囲む // 文末に「;」は付けない println("Hello Ebichu") // “Hello Ebichu” // 一行コメント /* 複数行コメント */
03 変数と定数を使う
変数
- 変数を使う前には宣言
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 基本データ型を見ていこう
基本データ型
- 文字列
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スタンプでも作るか!!
- でも絵描けないしPhotoshopやIllustrator使えない・・
- 手描きの絵でどうにかして作れないかな・・
LINEスタンプ 手描き
検索!- どんぴしゃな記事に出会う!出来る!
参考
【超初心者向け!!】秒速でLINEスタンプを自作する方法!|合同会社チームサンタ
の記事を参考にして作っていった。
とてもわかりやすく書かれていて参考になりました。ありがとうございます!
絵を描いてスタンプにするのはとても簡単。
スタンプを2040個考えて絵にする時間・気力・体力があれば誰でも作れる。
申請〜承認〜販売まで
細かい日付は残していなかったので曖昧
- 2014年9月某日
- LINEスタンプ作成開始
- 2014年9月23日
- 2014年11月末日
- スタンプのステータスが審査中に!
- 2015年2月27日
- LINE Creators Marketよりスタンプ承認のメールが!
- マイページにアクセスしてリリースボタンをぽちっと
- 2〜3時間でストアに反映されて購入可能に!
膨大なスタンプが申請されていると思うので、申請から承認まで半年位はかかりそう。
忘れかけてたよね・・・
リジェクトされずに一発で審査が通り、無事にストアに並んでいるので感動しました。
やり切れたので、自分で自分を褒めます。
作成したスタンプ
私立恵比寿中学さん大好き大好きという気持ちのまま勢いで作ったもの。
なぜこの名前にしたのか、など殆ど覚えていないが、
- 私立恵比寿中学
- エビ中
- シリツエビチューTシャツあったなぁ
- チュー・・・チュー・・・チューケン!忠犬ハチ公!
- 柴犬にシリツエビチューTシャツっぽいの着せよう!
- 字が入らない!チューが限界!
- (シリツエビ)チューが大好きな犬
- チュー犬!!
こんな感じ。アイドルが好きな柴犬が何かしてるスタンプ。
※私立恵比寿中学さんとは一切関係ありません。好きなだけです
公式でかわいいスタンプ出してくれないですかね〜
ロボサンのはあるけど・・・
形態素解析&マルコフ連鎖を使って文章をつぶやくTwitter botを作った
Rubyでtwitter botを作った。構想から完成まで約3ヶ月 何だかんだでものすごく時間がかかってしまった。。。
どうせなら使ったことのない言語で作りたかったので、Rubyに挑戦してみることに。
gitもまともに使ったことがなかったので、bitbucketでソースコードの管理をしながら作った。
完成するまでの流れを残しておく。
Rubyでtwitter botを作る方法を調べる
とにかくググる
- 10分でできるTwitter bot @ Ruby - 酒と泪とRubyとRailsと
- RubyでTwitter botを作る準備 - .logbook
- Twitter Botを、RubyとMongoHQを使って作ってみたのでまとめておく - is Neet
- rubyでtwitterbotを作ってみる | happymeme
- twitterのbotはrubyでチョチョイのパー
どうせだったらHeroku
使いたい(少しだけ使ったことあるから)
Herokuを使う方法を調べる
とにかくググる
調べていく中で、形態素解析
・マルコフ連鎖
という言葉を知る。
定期的につぶやくなら、決まった言葉をランダムにつぶやくだけじゃ面白くないので形態素解析
とマルコフ連鎖
を使ってみることに!
形態素解析&マルコフ連鎖について調べる
- テキストマイニングの初歩 Rubyで形態素解析を行う〜ruby-mecab | Scimpr Blog
- rubyで自分のツイートデータから頻出語を見つける - くろの雑記帳
- マルコフ連鎖でTwitter BOTを作る - FLYING
- TinySegmenter: Javascriptだけで実装されたコンパクトな分かち書きソフトウェア
- 2.pythonで対話型AI制作[形態素解析] - Just $ A sandbox
- 0.pythonで対話型AI制作 - Just $ A sandbox
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 API・Rubyのクラス分け
- TweetStream::Client
Twitter gemおよびTweetStream gemでストリーミングを受けてみる
なお、TweetStreamは背後でEventMachineベースのem-twitterが動いているので、並行処理を行う際にはEventMachineを使います。例えば
(前略)
EM.run do
EM::PeriodicTimer.new(5) do
puts Time.now
endclient.userstream do |object|
puts "recieve a tweet / class: #{object.class}"
puts object.text
end
end
とすれば5秒おきに時刻を表示しつつTLのツイートを表示してくれます。- クラス分けはまるっと参考に
- タイムラインからのツイート取得参考に
形態素解析&マルコフ連鎖
- マルコフ連鎖の部分はまるっと参考に
- Yahoo日本語形態素解析APIのgem
- 日本語形態素解析API
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
- https://devcenter.heroku.com/articles/git
- ローカルでの動作確認/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
- https://devcenter.heroku.com/articles/procfile
いろいろあったが何とか完成!他のエビ中関連botさんと会話しつつ、全く役に立たないbotは元気に稼働しています。内容は意味不明・・・
キングオブ学芸会bot (@kogakugeeeekai) | Twitter
これお気に入り
— キングオブ学芸会bot (@kogakugeeeekai) 2014年8月14日
あの強敵ボス“テスト”と戦ってきちゃった! #ebichu #エビ中
— キングオブ学芸会bot (@kogakugeeeekai) 2014年8月14日
参考にさせていただた皆様に感謝!
プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識をやっと読んだ
プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識
- 作者: 矢沢久雄,日経ソフトウエア
- 出版社/メーカー: 日経BP出版センター
- 発売日: 2001/09/27
- メディア: 単行本
- 購入: 21人 クリック: 513回
- この商品を含むブログ (81件) を見る
数年前に買ってちらっと見て本棚の片隅に置いてあったのをやっと読んだ。
まだまだ理解できない部分もあったが、今までこんなことも知らずにプログラマとして働いていた自分恐ろしい((((;゚Д゚))))
読んでよかった。第2版を電子書籍で買ってた事を思い出したよ・・・
第1章 プログラマにとってCPUとはなにか
- プログラム→コンピュータに実行させる処理の順番を示すもの→命令とデータ
- プログラムはメイン・メモリに
- 命令やデータはメモリのアドレスに格納される
- CPUがプログラムを実行
- CPU→制御装置+演算装置+クロック信号+レジスタ
- レジスタ→アキュムレータ・インデックスレジスタ・フラグレジスタ・プログラムカウンタ・汎用レジスタ
- アセンブリ!!!
第2章 データを2進数でイメージしよう
- ICのピンは1本で2つの状態を表す
- 32ビット・マイクロプロセッサは情報を入出力するためのピンを32本持っている!(衝撃
- 一度に32桁(32ビット=4バイト)の2進数の情報を処理できる!(衝撃
- シフト演算
- 補数(よくわかってない
- 論理右シフト、算術右シフト
- 論理演算
第3章 コンピュータが少数計算を間違える理由
この章は全然わからなかった・・
第4章 四角いメモリーを丸く使う
- メモリーの実態はICと呼ばれる電子部品
- アドレスを指定してデータを読み書き
- アドレスはデータを格納する場所を示すもの
- メモリーの論理的なイメージはビルディング
- ポインタ→データの値そのものではなく、データが格納されているメモリーのアドレスを持つ変数のこと。
- 配列
- スタック→LIFO(Last In First Out)
- Push, Pop
- キュー→FIFO(First In First Out)
- Put, Get
- リングバッファ
- リスト要素
- 2分探索木(聞いたことある
第5章 メモリーとディスクの親密な関係
- プログラムは記憶装置に格納されていて順次読み出されて実行される
- フォン・ノイマン
- パソコンにおける記憶装置→メモリー、ディスク
- ディスクに記憶されたプログラムがメモリーにロードされてから実行される
- ディスクアクセスを高速化→ディスクキャッシュ(メイン・メモリー内の領域)
- ディスクをメモリの一部として使う仮想記憶→ページング方式、セグメント方式
- ディスクの物理構造
- 一般的なパソコンではセクター方式
うーん。
第6章 自分でデータを圧縮してみよう
- ファイルにはバイト単位で記録
- ランレングス法(?
- ハフマン法(???
ここもよく理解できず
第7章 プログラムはどんな環境で動くのか
- 動作環境 = OS + ハードウエア
- AT互換機とかx86とか
うーん?
第8章 ソース・ファイルから実行可能ファイルができるまで
- コンピュータはネイティブ・コードしか実行できない
- ソースコードを翻訳するのがコンパイラ
- コンパイルだけでは実行可能ファイルが得られない(!
- コンパイルに続けて「リンク」という処理が必要になる(!!
- コンパイラは実行前にソースコードをネイティブコードに一括して翻訳。インタプリタは、実行時にソースコードの内容を1行ずつネイティブコードに逐次変換
10年前の新人研修でC言語の上っ面をかすっただけなので全く理解できず。。。
インタプリタの実行イメージがわからん。
実行時にネイティブコードに逐次変換したネイティブコードがメモリにロードされてから実行されるのかな??
第9章 OSとアプリケーションの関係
- システムコール
- OSと高水準言語がハードウエアを抽象化
流し読み
第10章 アセンブリ言語からプログラムの本当の姿を知る
- アセンブリ言語はネイティブコードと一対一に対応(!!!
- ネイティブコードへの変換プログラムが「アセンブラ」
- アセンブリ言語や、アセンブリ言語で書かれたプログラムのことをアセンブラと呼ぶ場合もある
- コンパイラでアセンブリ言語のソースコードを生成(!!! gccでやったら本と違うの出てきた!今度見る
- ネイティブコードに変換されない擬似命令
- アセンブリ言語の構文は「オペコード+オペランド」
- CALSにトライ!
アセンブリ言語面白かったから、もう少し勉強する(予定
第11章 ハードウエアを制御する方法
- ハードウエアとの入出力を支えるのはIN命令とOUT命令
- 周辺装置の割り込み
- DMA
流し読み
第12章 コンピュータに「考え」させるためには
- 人間の考え方をプログラムで表す(YES!
- 人間の癖をプログラムで表す(ほぅ
- 記憶を生かすことで、より人間らしい判断を行う(なるほど
第2版買っていたのでそっちも読みます。
コンピュータともう少し仲良くなったら今からでも成長できるかな!!!