Pebble Coding

プログラマーの作業メモ

swiftでFloat値の比較

swiftでは次のような演算子が定義されているので、FloatどうしやDoubleどうしの比較は 単純に==と!=で行えば良い。 FloatやDoubleはFloatingPointを継承しているため、この機能を持っている。 public func ==<T : FloatingPoint>(lhs: T, rhs: T) -> Bool public func !=<T : Equatable>(lhs: T</t></t>…

swift アクセス制御

open どこからでもサブクラスの作成、上書き定義可能 public このクラスを定義したモジュール内部でのみサブクラスの作成、上書き定義可能 internal (省略時) 定義を含むソースファイルと同じモジュール内部からアクセス可能 private クラスや構造体の定義単…

swift extensionで一回だけ実行されるグローバル定数宣言の仕方

こうすればいいらしい。 extension DateFormatter { public static let standard: DateFormatter = { let obj = DateFormatter() obj.locale = Locale(identifier:"en_US_POSIX") return obj }() }

swiftでsingleton

swiftでSingletonを書く場合、こうすればいいらしい。 class MySingleton { static let shared = MySingleton() private init() {} } The Right Way To Write a Singleton — KrakenDev

詳説 AudioStreamBasicDescription / AVAudioFormat

CoreAudioでよく使われるAudioStreamBasicDescription これはC言語の構造体で使いづらいです。 macOS10.10, iOS8以降ではAVAudioFormatと相互変換できますので、これを経由するとコーディングが簡単になります。 まずは実例を見ていきます。 よく使われる.wa…

iOS10のSpeechToText APIを使って日本語PodCastをテキスト化してみる

iOS10で公開されたSpeechフレームワークを使って日本語PodCastをテキスト化してみました。 結果から言うと、テキスト化は可能でしたが、品質はかなり悪く実用として厳しかったです。 某IT系PodCastのファイルを食わせて見たんですが、 「ジャバスクリプト」…

C言語のsizeofをswiftで書くにはMemoryLayout<T>.size

タイトルそのままです。 struct Hoge { var a: Int32 var b: Int32 } MemoryLayout<Hoge>.size // 8</hoge>

Arrayにおけるmap, flatMapの動作(swift3)

ググると引っかかるのか今だにswift2のドキュメントなので、swift3用のメモ let a = [1, 2, 3] let b = a.map { Array(repeating: $0, count: $0) } print(b) // [[1], [2, 2], [3, 3, 3]] let c = [1, 2, 3] let d = c.flatMap { Array(repeating: $0, coun…

enum Optional<Wrapped> の map, flatMapメソッド

swiftのソースでmapとflatMapというメソッドがよく出てくるのだが、このメソッド名からは想像できない動作をするのでメモしておく。 (メソッド名変えてくんないかな。。) Optionalの定義を見ると次のようになっている。 public enum Optional<Wrapped> : ExpressibleB</wrapped>…

swift 2つの連続する矢印

swiftでこんなソースが出てきた。-> が2つ連続しているが意味がすぐには分からない。 func multi(val:Int) -> (val:Int) -> Int { return { a_val in return a_val * val } } 省略されている()を書くとこうなる。 func multi(val:Int) -> ((val:Int) -> Int)…

swift ComparableIndex

swiftのComparableプロトコルはEquatableプロトコルを継承しているので、Comparableと同じことがしたいがEquatableは実装したくないという時に使えない。 その場合、Comparableに相当するプロトコルだけを自分で実装すれば良い。 public protocol Comparable…

PromiseKit4.0 (swift3)を使ってみた 2016年11月

swift3で作ったiOSアプリでサーバーへHTTPリクエストを複数回投げる場合に、 普通に作ると、正常ケース、異常ケースの処理があちこちにばらけて、ソースが汚くなります。 PromiseKitを使ったところ、ソースが短く、処理も追いやすくて素晴らしかったので、メ…

digital oceanでipv6を追加したらDNS解決できなくなった話[RESOLVED]

digital oceanに作ったCentOS6のVPSにipv6を追加したところDNS解決できなくなりました。 CentOS7の方は手順通りでうまくいったのですが、CentOS6の方は、 ping google.com が効きません。 /etc/resolve.conf にはGoogleのipv6のDNS2つが定義されています。 n…

VisualStudio 2015 VsVimでCtrl+Bが効かない

VisualStudio 2015 に VsVimを入れて使っています。 Ctrl+F(前方スクロール)は動くのですが、Ctrl+Bすると関数のブレークポイント設定機能が動いでしまい、後方スクロールが動きません。 解消するには、「ツール」-「カスタマイズ」-「キーボード」を開き…

CentOS7にNewRelicのnginxプラグインをセットアップする

まずyumでプラグインを入れないといけないですが、そのためにまずリポジトリを追加しないといけません。 以下ファイルを編集します。 /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgc…

IPv6環境のActionMailerでのgmail送信でNet::OpenTimeoutエラー発生

IPV6環境のActionMailerでgmail送信すると Net::OpenTimeout (execution expired): となってしまい送信できない。 telnet smtp.gmail.comを実行すると分かるが、まずIPv6で接続をトライし、60秒くらいでタイムアウトした後、IPv4で接続トライする。 最初から…

apple-touch-icon.png 読み込みエラーの抑制

safariでrailsで作ったサイトにアクセスした時に、railsのログにapple-touch-icon.pngが読み見込めないエラーが出ている。 このエラーを抑制するにはrailsでfaviconファイルがあるフォルダpublicに0バイトのapple-touch-icon.pngを置けば良い。 $ touch appl…

C++11 type_traits の原理

std::iteratorのソースを読んでいたところ、C++11のtype_traitsがよく分からないため、勉強中。 備忘録として解説しておく。 C++11で<type_traits>というヘッダがSTLに追加されている。 type_traits - cpprefjp C++日本語リファレンス 型の特性を判定、操作するための機能</type_traits>…

C++11でのautoを使った関数定義

C++11では関数定義をautoを使って書くことができるようになった。 今まで int get_value(void); と書いていたものが、C++11以降はこのようにも書ける auto get_value(void) -> int; int get_value1(void) { return 1; } auto get_value2(void) -> int { retu…

std::shared_ptr利用法

std::shared_ptrの利用法です。Infoインスタンスは内側のスコープ内で生成されて外側のスコープ内で破棄されていることが分かります。 struct Info { Info(){ printf("Info() %p\n", this); } Info(const Info& obj) = delete; Info(Info&& obj) = delete; I…

std::vectorメモリ管理

std::vectorにはreserveというメソッドがあるがどのように動作するのか調べてみた。 struct Info { uint8_t* dex = nullptr; Info(){ dex = new uint8_t; *dex = 7; printf("%p Info() dex %p %d\n", this, dex, *dex); } Info(const Info& obj){ dex = new …

C/C++ 構造体アライメント最適化

C/C++の構造体の要素はある程度の境界位置にアライメントされる。そのため、要素の定義順序によって、構造体全体のサイズが変わったりする。たかが数バイトと侮るなかれ。要素数が多ければ、それだけメモリ領域が小さくなり、CPUキャッシュミスが起きる確率…

iOS/OSXにおけるスレッド優先順位

iOS

iOS/OSXではスレッドスケジューラーの出来が良く、細かい設定が可能である。 例として、CoreAudioでのコールバックスレッドのスレッドポリシーがどうなっているかみてみる。 OSX 10.11.6 1.6GHz Core i5 standard policy_count 0 get_default 1 importance 3…

macOS環境でrustを学習する

以下の日本語ドキュメントで学習します。 プログラミング言語Rust インストール ~$ curl -sSf https://static.rust-lang.org/rustup.sh | sh rustコンパイラのバージョン確認 ~$ rustc --version rustc 1.11.0 (9b21dcd6a 2016-08-15) vimシンタックスハイラ…

atomic::compare_exchange_weak C++11

bool compare_exchange_weak (T& expected, T val, memory_order sync = memory_order_seq_cst) noexcept; compare_exchange_weakの動作仕様がいつまでも覚えられないので、メモ。 覚える必要があるのは第一引数と第二引数と戻り値。 メモリオーダーはとりあ…

std::atomic における memory_order_relaxed の動作(C++11)

memory_order_relaxedの使い方がいまいち分からなかったのだが、やっと理解できたので、それついて書いておく。 memory_order_relaxedの説明を探すと以下が見つかる。 Each memory location has a total modification order Memory operations performed by …

C++11 std::atomicを使いこなすための情報リスト

C++11 std::atomicは難解です。 しかし、パフォーマンスが出ない時に頼りになるツールでもあります。 情報はなかなか少ないので、適宜まとめておきます。 CPUの動作に関する説明 CPU とキャッシュのはなし - graphics.hatenablog.com プログラミング :: 高速…

C++ 小さいサイズの構造体を引数に渡す時は値渡し、参照渡しどちらが高速か?

調べてみました。 こんなサンプルで時間を計測しました。 struct Hoge { float a; float b; }; Hoge hoge1 = { 25, 26 }; Hoge hoge2; // 値渡し void func1(Hoge hoge){ hoge2 = hoge; } // 参照渡し void func2(const Hoge& hoge){ hoge2 = hoge; } 1) flo…

C++11環境におけるatomic操作のパフォーマンス比較

C++11のatomic関数はどのくらいのパフォーマンスを出せるのか調べてみました。 short変数に対してスレッド2つを使い、スレッドAが書き込み、スレッドBが読み込みとします。 環境: Intel Core i5 1.6GHz コア数:2 2次キャッシュ(コアのキャッシュ):256KB 3次…

lower_bound,upper_bound(C++)

lower_boundとupper_bound lower_boundとupper_boundはソート済みSTLコンテナにおいて、それぞれ、指定の値以上の値が最初に現れる位置と、指定の値より大きい値が最初に現れる位置のイテレーターを取得する。図にするとこんな感じ。 コンテナ境界周りの動作…

swiftでフェルマーの素数定理をInt64の範囲内で確認してみる

最近、素数の本を読んで面白かったので、 フェルマーの素数定理 任意のp:素数 n:自然数に対して、np - n を p で割った余りは 0 である。 をswiftで数値計算でInt64の範囲でいいから確認してみたい欲求に駆られ、実装してみました。 import Foundation infix…

rails ログインのintegration testで失敗する原因

railsでログインのintegration testでCSRFエラーが出て、テストに失敗する。 ブラウザから実行した時はエラーにはならない。 延々、原因が分からず、かなり遠回りした結果、原因が判明した。 1) .bash_profileにRAILS_ENV=developを設定していると、rake tes…

swift C言語形式のループの置き換え

swift3ではC言語形式のループが廃止されます。 swift2.2の現時点では、deprecatedになっています。 書き換え方がわかりずらいのでメモ print("case to") for i in 0.stride(to:2, by:1) { print(i) } for i in 0..<2 { print(i) } print("case through") for…

rails 文字列に対するpresent?

nil? empty? はrubyのメソッドですが、 present? blank? はrailsのメソッドです。 文字列に対しては以下のようになります。 $ rails console Loading development environment (Rails 4.2.2) irb(main):001:0> a = nil => nil irb(main):002:0> b = " " => "…

rails ネストしたリソースのscaffoldを作る

ネストしたリソースのcontrollerやviewの書き方が分からなすぎるのでどうしたらいいものかと思ったら、そのものズバリ、ネストしたscaffoldを作るgemがありました。 GitHub - amatsuda/nested_scaffold: Nested scaffold generator for Rails 4.2 and 5 これ…

rails 基礎知識

railsは細かい部分の仕様の説明が明快に行われているドキュメントがない。トライアンドエラーで得た知見をメモしておく。 hoge.html.erb内で使えるクラスのインスタンス変数(@hoge,@fuga等)はコントローラークラスのインスタンス変数である。モデルクラスの…

Twitter Omni Authで401 Authorization Required

OSX 10.11.5 rails 4.1.1 development Perfect Ruby on Railsの6章を写経したら、twitterのOmniAuthが動かない。 散々悩んだ挙句、twitterのWebsiteを http://127.0.0.1:3000/ Callback URLを http://127.0.0.1:3000/auth/twitter/calback に変更し、ブラウ…

railsアプリをunicornでCentOS7のsystemdで立ち上げる時のサービスファイルの書き方

/etc/systemd/systemにalpha.serviceというファイル名で以下の内容を作成する。ファイルに実行権限は不要。 どこか間違っている、過不足等いっぱいあるかも。またアプリはalphaというUnixユーザーで実行するようにしている。 railsバージョンは4.2.2 Databas…

rails mysqlで絵文字がDBに入る場合の注意

railsにてfixturesをloadしようとして次のようなエラーが出た。 ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xF0\x9F\x98\x83\xE3\x81...' for column どうやら、UTF8で4バイトになる絵文字が入っているところでエラーになっ…

ruby BCryptダイジェスト

BCryptのrawハッシュ値(データベースのpassword_digestに入る文字列)は以下の4つを$で区切った文字列である。 @version, @cost, @salt, @hash 例えば、 "$2a$10$PqSI0YWw/JHk2zKWRF1ol.5pRtgJKPsJqJa8pvIn4IzatuxY.SPmu" をsplit('$')すると ["", "2a", "10…

ruby コマンドメモ

$ bundle open {gemname} でgemのソースが入ったフォルダをvimで開く 例えば、私の環境で $ bundle open crypt とすると、 vimのnetrwで "~/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bcrypt-3.1.11" のフォルダが開かれる。

ruby 文法その5

class HelloWorld attr_accessor :name end セミコロンが付いていて、シンボルになっているのがミソ。 これは、以下のように書くのと同じ class HelloWorld def name @name end def name=(value) @name = value end end ここで@nameはインスタンス変数 引数…

swiftでのmarkコメントの書き方

Objective-Cでは以下のように書いていましたが #pragma mark - UICollectionViewDelegate swiftではこう書きます。 // MARK: - UICollectionViewDelegate もしくは /* * MARK: - UICollectionViewDelegate */

C/C++/ObjC メモリ破壊系バグのつぶし方

メモリ破壊系バグとは メモリ破壊系バグとは、プログラマーが想定して割り当てたメモリ領域のサイズを超えた部分にデータを書き込んでしまい、プログラムが意図通り動作しなくなるバグのことです。 このバグは以下の特徴を持っています。 再現性が100%ではな…

swift objc_overrelease_during_dealloc_error

objc_overrelease_during_dealloc_error というエラーでクラッシュしていたんだが、 takeRetainedValue() を takeUnretainedValue() に変えたら落ちなくなった。 retainしすぎていたということか。 swiftでのUnmagedはイマイチ理解できていない。

try! swift 参加レポート

3/2-4 渋谷マークシティにて行われたtry!swiftカンファレンス http://www.tryswiftconf.com に参加してきましたので簡単な感想です。 スピーカー33名(日本人2割)、参加者約500名(日本人8割) という規模のswift言語やApple関連ソフトウェアに関する コミュニ…

swift タイプエイリアス

Type Aliases typealias AudioSample = UInt16 プロトコルのAssociated Typeには特定のプロトコルに準拠することという条件を付けられる。 protocol PBProtocol { typealias PBError: IntegerType } class PBClass: PBProtocol { typealias PBError = Int } …

swift 列挙型

enum CompassPoint { case North case South case East case West } var directionToHead = CompassPoint.West directionToHead = .East directionToHeadは一旦、varで代入されて型が固定されると、次の行以降はdot表現が使える。 Associated Values enum Ba…

swiftで定義した構造体、列挙体はObjective-Cでは使えない

swiftで定義した構造体、列挙体はObjective-Cでは使えないようだ。 使えないもののリストはこちら。 Generics Tuples Enumerations defined in Swift without Int raw value type Structures defined in Swift Top-level functions defined in Swift Global …

swift ジェネリクス、プロトコル

struct Stack<Element> { var items = [Element]() mutating func push(item: Element) { items.append(item) } mutating func pop() -> Element { return items.removeLast() } } このジェネリック構造体を拡張してみる。 ジェネリック型を拡張する際は、extensionの</element>…