arusu0629のブログ

UnityエンジニアからiOSエンジニアへ

クラロワガイド - Privacy Policy

Privacy Policy

Toru Nakandakari built the クラロワガイド app as a Free app. This SERVICE is provided by Toru Nakandakari at no cost and is intended for use as is.

This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.

If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at クラロワガイド unless otherwise defined in this Privacy Policy.

Information Collection and Use

For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way.

The app does use third party services that may collect information used to identify you.

Link to privacy policy of third party service providers used by the app

Log Data

I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.

Cookies

Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.

This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.

Service Providers

I may employ third-party companies and individuals due to the following reasons:

  • To facilitate our Service;
  • To provide the Service on our behalf;
  • To perform Service-related services; or
  • To assist us in analyzing how our Service is used.

I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.

Security

I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.

Links to Other Sites

This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.

Children’s Privacy

These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.

Changes to This Privacy Policy

I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page.

This policy is effective as of 2020-12-08

Contact Us

If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at arusu0629@gmail.com.

This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator

iOSDC Japan 2020 に初参加してきました!🎉

iOSDC とは

iOS に関する技術やノウハウを LT や 10~40分 ほどのトークセッションが行われるイベントです。 今年4月に iOS エンジニアに転身して初めての iOS イベントに参加して楽しかったので活動報告をします。I will Blog!!!

iosdc.jp

1日目(9/20)

※0日目(前夜際)は諸事情で参加出来ませんでしたmm

まず1発目は以下のトークセッションを見ました! fortee.jp

見たかった理由としては今個人で開発しているアプリでバックグラウンド処理を実装してて(したけど上手く機能していなく...)その参考にと思って参加しました!

自分が使っている機能は Background App Refresh とは違う形での実装例(=Background Notification)でしたが、他のバックグラウンド処理がある事を知って勉強になりました

次は以下のセッション fortee.jp

Keychain のライブラリでお世話になっていて、またほんの少し関連のある Yappli のエンジニアの方のセッションでした!

環境や状況はかなり違いましたが、自分の今の現場にもどうにか活かせないかと自動化を前向きに考えさせられるセッションでした。

次は ZOZO の理想の組織像Sansan/EightのiOS開発を行ったり来たりで聴いていました。

前者は iOS エンジニア(iOSに限らずだと思いますが)に対して手厚い福利厚生が魅力的だったり、

後者は今現場で採用している同じアーキテクチャーである VIPER の話があったり興味深いセッションでした。

後半はより興味があったセッションが複数被っていて見れていないのも多々ありましたが、 uhooi さんの CI についてのセッションが直ぐに実践してみたいと思った講演でした。 (しかも自分が見た講演の中で1番コメント欄が盛り上がっていました笑 ニコニコユーザでは無かった自分自身もあのコメントの盛り上がりには感動しましたw)

fortee.jp

2日目(9/21)

2日目の1発目は以下のセッションを見ました! fortee.jp

最近 Storyboard に慣れてきたと思った矢先にほとんど知らない機能の紹介(詳解)が盛りだくさんのセッションでした。 Size Classes は社内でも最近ホッと?で聞いたことはあったけど、その他はほぼ初耳の内容でした!

次は以下のセッション fortee.jp

普段はパフォーマンスについて意識する事がほぼほぼ無く、自分自身の知識が少なかったので見ました!

リリースしているアプリに対して、どうアプローチしてどういう結果になって今後はこういう風にして行きたい、という展望まですごく具体的で参考になるセッションでした。 (※Appium だけはよく分からない技術?ツールだったので要調査します!)

午後の部はアニメーションでも活用できそうな CGAffineTransform についてのセッションを聴いたり SwiftUI のセッションを主に聴いていました!

レギュラートーク最後はテストについて話された以下のセッションです fortee.jp

序盤から分かりみが深い内容ばかりでした。自分自身の書いたコードの不安を少しでも取り除くためにテストを書いたり、あらゆる仕様を網羅して考えるためのテストコード、デグレを防ぐためのテストコードなど有用な面を紹介しつつも、学習コストのハードルの高さやどこから手を付ければ良いか分からないなどちゃんとデメリットも述べられていた為になるセッションでした。

LT(ライトニングトーク)

また 1,2日目の終わりには生で 5分間の LT が行われていて、オンラインにも関わらず臨場感あふれる雰囲気の中怒涛のスピードで色々なお話が聞くことが出来ました。

ハンズオン形式でその場で実演したり、5分間厳密なので途中で発表が終わったり、終了の合図の『ドラ』の音が大きかったり、1番 LT が盛り上がっていたなーと個人的には思いました! オンラインでこの盛り上がりなら、オフラインでみんなが同じ会場にいる場だともっと熱気や雰囲気は凄いんだろうなーと感じました。

まとめ

とりあえず、すごく楽しかったです! 技術的に分からない事もたくさんありましたが、 iOS開発についてすごくモチベーションが上がりました! 来年は参加者(視聴者)以外の形でも何かしら携わってみたいなーと心の中で少し思いました! スピーカーの皆さん、スタッフの皆さん、本当にお疲れさまでした。とても楽しいカンファレンスをありがとうございました!

『宇宙と宇宙をつなぐ数学 IUT理論の衝撃』を読んで

前説

本記事は 『宇宙と宇宙をつなぐ数学 IUT理論の衝撃』 という本を読み、自分なりの理解を整理して何かしらのアウトプットをすることで記憶に定着させる事を目的にしたものです。


この本を読むきっかけ

いくばくか前にあの 『ABC予想』 がついに解決されたとして巷で話題になっていた。当時自分も少なからず耳に入っていたが、そこまで深く関心は無かった。

それから数カ月後してたまたま好きな Youtuber である QuizKnock さんがこの話題に触れた動画を見て改めて触れてみようと思うきっかけが芽生えた。

【25分で中学生でも分かるabc予想】何に役立つの?ふくらPがよく分かる解説!

また 『Stardy - 河野玄斗の神授業』 という Youtube チャンネルでも同じような解説動画があり、こちらも視聴しました。

数学界の天才が証明したABC予想をわかりやすく解説してみた

そこで 『ABC予想』 に興味を持った自分は一般人でもなるべく分かりやすく解説した著書があると知り、今回この本を読むことになった。 (著書名にもあるように解説するのはあくまで 『ABC予想』 を解くのに重要な 『IUT理論』 についてである)


感想

まず本書を読み終えて自分なりに理解した 『IUT理論』 の結論としては以下3点です。

  • 数学の 舞台(=宇宙)を複数 用意する
  • 異なる数学の舞台間では 対称性通信 を行う
  • 通信によって発生する 歪み・不定性・ノイズ定量的に評価し、不等式を導く

本を読んでいない方は意味不明だとは思いますが、自分も正直さっぱり分かっておりません。 ただ 『IUT理論』 の基本的な考えはこれらだと自分の頭では理解しています。

1つずつの内容を覚えている範囲で掘り下げていきます。 (以下は自分の感想と本書に載っている内容が入り乱れて書かれております)

数学の 舞台(=宇宙)を複数 用意する

まず筆者は数学の足し算とかけ算には切っても切れない関係(=正則構造)にあると述べています。 そこで1つの数学の舞台ではその関係性を用いた問題?(ABC予想は少なくとも足し算とかけざんの問題)を解くことは非常に困難であるとし、数学できる舞台を複数用意して考えることが必要だとありました。

ここで最初自分は 複数の舞台 = 等式の右辺と左辺(イコールで分け隔てたもの) のものなのかなーと思っていましたが、その考えではありませんでした。 また複数の舞台を設けてどうやって問題を解いていくんだ?と思うかもしれませんが、自分もまだハッキリと分かっていない状態です。。。

異なる数学の舞台間では 対称性通信 を行う

まず 対称性通信 の前にどうして通信をするのかと言うと、舞台(=宇宙)が分かれているものの、扱っているモノ自体は 同じで同じではない数学の問題 なのです(この辺りから自分でも何を言っているか分かりませんが、本書でもそういうニュアンスだったと思います...) そのためにお互いが自分の情報を相手に伝えることで(双方向なイメージでは無かったのですが...)導き出したい答えに近づけていく(=復元していく)というアプローチです。

ここで 対称性通信 としているのは モノの「状態」を伝えるのではなく、操作を伝える事が重要で、それを『群』として相手に伝えることが肝とありました。それはどうしてかというと、『群』を通信することで異なる舞台での復元が可能になるからです。 (通信する群は様々な特徴を持っていたり、より複雑な構造をした 遠アーベル幾何学? であればあるほど復元の正確度が高いとの事です。恐らくこれは複雑であればあるほどそれを満たすモノが一意に決まるからではないかと自分は思っております)

ところで、群論?については名前自体は聞いたことも有り知らずに使っていた学問でしたが、改めて初めて知ったような感覚でした。

通信によって発生する 歪み・不定性・ノイズ定量的に評価し、不等式を導く

最後にこの内容は1番理解が難しかったです。この一文自体はなんとなく「まぁ、異なる舞台間で通信してたらそういう歪みとか考慮しないといけないよな」と思い納得はしていたのですが、その方法の説明は正直本を1周しただけでは本当によく分かりませんでした。 (今書きながらも何も自分の頭に残っておらず2周目を読み直しています)

2周目でも本当によく分からないので、理解した事だけを述べると、

  • 対称性通信には歪みや不定性がつきものでしょうがないということ
  • その歪みや不定性を最小限にすることが重要でそれを可能にしているのが テータ関数

テータ関数についてはあまり詳しく述べられていませんでしたが、自分なりの解釈をするならば「そのまま通信しても復元の正確性は低いが、テータ関数を通して対称性通信をすることで復元の正確性が高い事が実現できる」というイメージです。復元の正確性を高めるための道具がテータ関数です

また読み直していると、歪みや不定性をどのようにして計算・評価しているのかは具体的に述べられていないような気がしました。本書では以下のような感じで書かれています


 N log(q_A) \fallingdotseq log(q_A) \\
上記の式を「IUT理論では次のような形の不等式が得られます」と書かれている \\
N log(q_A) < log(q_A) + c \\

おそらく から < に変換出来たことが歪みや不定性を計算・評価できたという自分の中での解釈です。(どうしてそうなるかは特に述べられていないはず)


さいごに

以上を持ってこの記事は終わりにしたいと思います。 もしかすると読者の中には 「『ABC予想』について全然触れていないのでは?」と思う方もいるかと思いますが、これはこの本書自体がそうであり、『ABC予想』を解くことが重要ではなく、『IUT理論』という新しい数学の考え方を知ることがより重要であると述べられていたからです。

.swiftlint.yml の中身をザックリ把握

【概要】
業務で使用している .swiftlint.yml の中身について理解を深める

# 無効にするルール。
disabled_rules:

# コードの記載のない改行を許可したい
- trailing_whitespace

# force_cast は場合によっては使用するため
- force_cast // object as! String を許可

# 変数名の直後に ":" を置かないのを許可する
- colon // let noWarning :String = "" , let noWarning : String = "" を許可

# "," の前にスペースを入れないのと、 "," の後にスペースを入れなくてよいのを許可する
- comma // (a,b), (c , d) // これらを許可

# identifier_name 変数名にアンスコ使いたい
- identifier_name // 3文字~41文字以内の制限を外すため

# 一行で書いたほうが簡潔な場合もある
- switch_case_on_newline // case .sunday: print("Today is Holiday") を許可する

# 値を使わない enum case を許可するため
- empty_enum_arguments // case monday(day: Int) の時に case .monday(_): を許可する

# typealiasで1文字も使うため
- type_name // typealias x = Void を許可

# 1つのメソッド内で条件式を11個以上使うのを許可する
- cyclomatic_complexity  // Cyclomatic Complexity Violation: Function should have complexity 10 or less: currently complexity equals 11 (cyclomatic_complexity)

# switch 文で fallthrough を許可するため
- fallthrough // case .bar: fallthrough case .bar2: something() がOK

# デフォルト無効のルールのうち、有効にするもの。
opt_in_rules:
- attributes                     // @IBOutlet \n private var label: UILabel を許可
- closure_end_indentation        // クロージャのインデントを揃える
- closure_spacing                // クロージャの処理を始める際に空白スペースを入れる [].map { print($0) }
- conditional_returns_on_newline // return は改行する if true { return } は NG
- empty_count                    // if [Int]().count == 0 は NG [Int]().isEmpty を使用する
- explicit_init                  // let hoge = String.init("hoge") は NG
- fatal_error_message            // fatalError("") は NG fatalError("Error") など必ずメッセージ有りにする
- first_where                    // filter して first よりも first(where:) を使うことを推奨する
                                 // let hasWarning = hoge.filter { $0 > 1 }.first
                                 // let noWarning  = hoge.first { $0 > 1 }
- missing_docs                   // クラス外の public メソッドや public な protocol には docs を付ける必要がある
- nimble_operator                // 簡単(単純な?)な演算子比較を行いましょう?(よく分からなかった)
                                 // hasWarning: expect(10).to(equal(10))
                                 // noWarning : expect(10) == 10
- overridden_super_call          // (いくつかの)オーバーライドしたら親のメソッドを必ず呼ぶ & 複数回呼ぶのは NG
- prohibited_super_call          // (いくつかの)オーバーライドした親のメソッドを呼んではいけない override func loadView() { super.loadView() } は NG
- redundant_nil_coalescing       // 値が nil だと分かっている時に nil 結合演算子 を使うのはダメ var hoge: Int? = nil; var fuga = hoge ?? nil は NG
- sorted_imports                 // import ファイル名は名前でソートさせる
- valid_docs                     // missing_docs に変わった?

excluded:
# 追加した OSS ライブラリは対象に含めたくない
- Pods/
- Carthage/

# 1行あたりの文字数制限を300に変更
# プロジェクト作成時にデフォルトで追加されるコメントをひっかけないため
line_length: 300

# Array や Dictionary 中の末尾の "," を矯正で付ける
trailing_comma:
    mandatory_comma: true

# elseは改行する
statement_position:
    statement_mode: uncuddled_else

# メソッドの行数は50行以下にする
function_body_length: 50

【おまけ】

$ swiftlint autocorrect --format // .swiftlint.yml に応じて自動フォーマットしてくれる
$ swiftlint // 構文チェック

MacbookPro をクリーンインストールしたので初期設定の備忘録

概要

新生活が始まるので気分転換に Macクリーンインストールしたのでセットアップ内容を忘れずにまとめておく。


システム環境周り
インストールソフトウェア
CUI周り
  • brew (cask)
    • emacs
      • .emacs.d/init.el を gists から取ってくる
      • Option-v が √ が表示されてしまう問題
        • Preferences -> Profiles -> Keys -> Left Option Key: Normal から Esc+ に変更する
    • tig
      • .tigrc を gists から取ってくる
  • zsh
    • .zshrc を gists から取ってくる
公開鍵設定

WebGLについて⑬

【前回】 arusu0629.hatenablog.com

複数モデルのレンダリング

複数のモデルをレンダリングする際に新しくVBOを用意する必要はなく、元々使用していたVBOを再利用する

複数のモデルを違う位置にレンダリングするので、操作するのはモデル変換行列。ビュー変換行列とプロジェクション変換行列はどちらのモデルに対しても同じものを適用する

前回までのjavascriptからの変更点を抜粋

  • tmpMatrixにビュー, プロジェクション座標変換行列を掛け合わせたものを保持しておくm.multiply(tmpMatrix, mMatrix, mvpMatrix);
    →どちらのモデルに対しても同じものを使うので再利用する
  • 1つ目のモデル, 2つ目のモデルそれぞれのモデル座標変換行列を用意する
    →1つ目のモデルは(1.5, 0, 0)の位置で2つ目のモデルは反対側の(-1.5, 0, 0)の位置
    ※ この時の注意点として2つ目のモデル座標変換行列を用意するときにm.identity(mMatrix)としている点である。これは初期化処理に当たり、1つ目のモデルのモデル座標変換行列をリセットしている

WebGLについて⑫

【前回】 arusu0629.hatenablog.com

ポリゴンに色を塗る(頂点色の指定)

前回までにただのポリゴンの描画までしてきましたが、今回はその描画したポリゴンに色を付けていきます。

ポリゴンに色を付けるには、頂点情報に「色情報」を追加してあげればOKです!

まずはhtml側のソース

追加した箇所

attribute vec4 color;  // 頂点バッファから色情報を受け取るための変数
varying   vec4 vColor; // フラグメントシェーダに色情報を渡すための変数

// 頂点シェーダ
void main(void) {
    vColor = color; // 頂点バッファ(VBO)から受け取った色情報をフラグメントシェーダに渡すための変数に代入する
}

// フラグメントシェーダ
precision mediump float;

varying vec4 vColor;

void main(void) {
    gl_FragColor = vColor; // 頂点シェーダから渡された色情報を使う
}

精度を指定するprecision precisionは数値の精度を指定するためのキーワードで、続けて精度修飾子を記述することで利用できる
【精度修飾子】
lowp : 精度低
mediump : 精度中
highp : 精度高


続いてjavascript側のソース

追加した箇所

// 位置情報に加えて色情報を取得するために配列として取得する
var attLocation = new Array(2);
attLocation[0] = gl.getAttribLocation(prg, 'position');
attLocation[1] = gl.getAttribLocation(prg, 'color');

// attributeの要素数を配列に格納
var attStride = new Array(2);
attStride[0] = 3;
attStride[1] = 4; // 色情報はvec4

// 頂点の色情報
var vertex_color = [
   1.0, 0.0, 0.0, 1.0,
   0.0, 1.0, 0.0, 1.0,
   0.0, 0.0, 1.0, 1.0
];

// 色情報のvboを生成
gl.bindBuffer(gl.ARRAY_BUFFER, color_vbo);
gl.enableVertexAttribArray(attLocation[1])
gl.vertexAttribPointer(attLocation[1], attStride[1], gl.FLOAT, false, 0, 0);


今回は位置情報に加えて色情報も頂点シェーダに渡す必要があるので、attLocationを配列として用意してあげる
同じようにattStrideも配列として用意して位置情報と色情報の要素数をそれぞれ指定する

頂点の色情報をvertex_colorと配列で定義して、要素数頂点数 × 4で構成されている

続いてVBO(頂点バッファ)の生成部分だが、位置情報と同じようなやり方でcreate_vboメソッドを用いて色情報専用のVBO(color_vbo)を生成する
あとはバインドして登録すればhtml側で定義されたattribute変数に渡すことができ、各頂点に色情報が付与される

【実行結果】 f:id:arusu0629:20180408202122p:plain

【続き】 arusu0629.hatenablog.com