Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

2016-01-01から1年間の記事一覧

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/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 b…

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 に変更し、ブラウ…