BLOGakisuteが主に技術的なネタを書き溜めるブログです。最近フォント周りについて深く掘り下げる機会がありましたので、その際のメモを残しておこうと思います。́・_・`)UIFontのプロパティについてUIFontにはフォントに関する数値を表すプロパティが存在します。ありますが、もっとも重要なのは以下に列挙するプロパティです。pointSizelineHeightascenderdescenderleadingcapHeight以下の画像を見ると非常にわかりやすいかと思います。http://stackoverflow.com/a/35922853これを踏まえて各プロパティを解説すると以下のとおりになります。pointSizeフォントのサイズを表します。descenderとなり、すなわちpointSizeは上端と下端に空白を含まない純粋なフォントの高さだけを表す数値であると言っても良いと思います。上下に空白を作らない高さでフォントを描画したい場合はこの高さを使うと良い、と言い切って間違いないと思います、ごく一部の変なフォント以外。gapも存在するなら含む)までの完全な高さを表します。飾り文字などではないまっとうなフォントであれば、必ずこのlineHeightの中に文字の高さが収まるようになっています。gapを表現していることがあります。gapに相当する空白を持っています。システムフォントで顕著にそれが見られます。実際にフォントが画面上にレンダリングされるときはこのlineHeightがすべての基準になっているケースが多いです。ascender全てのアルファベットの文字の最大高さを表します。この高さまで描画されるのはごく一部の文字だけで、殆どの文字はcapHeightまでの高さしか使いません。詳細はこの後のcapHeightを参照してください。yなどの下付き部分の高さを表します。日本語の文字でこの領域に描画される文字は私が知っている限りでは存在しません。UIFontが返す値は常にマイナスになるので気をつけてください。CTFontが返す値は常にプラスです。めんどくさいので常にfabs()を通すといいと思います。gapを含む)までの高さを表します。gapの部分だけがleadingとなっていますがヒラギノフォントで試した限りは誤りです。Baselineから下全てが対象になっているようです。gapとは「全く別の値が付与されていることがあります」。飾り文字のあるフォントについて、lineHeightよりもフォントの描画が大きくなるぐらい下に飾りが伸びていたとしても、leadingの値はそこまで考慮して付与してあるので、usesFontLeadingのオプションを付与すると下の行にはみでなくなる、みたいなケースが存在します。capHeightアルファベットの大文字の最大高さを表します。日本語の文字は(特に漢字は)基本的にすべてcapHeightの高さに描画されます。capHeightより上に描画されるのは、例えばÅ(Aウムラウト)のように修飾子が付いているアルファベットや、日本語だと濁点および【】隅付き括弧のような一部の文字が、capHeightよりも上に描画されます。覚えておきたいのがleadingというプロパティの働きです。TextにusesFontLeadingというような名前のオプションが存在するケースが多々ありますが(例えばNSAttributedString.boundingRect(with:options:context:)のoptionsとかですね)、これは何かというと、usesFontLeadingが指定されている場合、lineHeightの計算の際に常にUIFont.leadingの値が使用される。styleを付与してlineSpacingに0を付与していたとしても、フォントにleadingの値が付与されていたら、それ以上に行の高さが低くならず必ず行間が開いてしまう。いうオプションになります。leadingを疑ってみてください。8以上については以下のとおりです。leadingを使用しません。leadingを使用しません。leadingを使用しますが、UITextView.layoutManager.usesFontLeadingの値をfalseにすることで回避可能です。leadingが常に「使用されてしまいます」。6以前のUILabelの挙動がそのまま残っているためではないかと思われます。同じUILabelクラスですが中身と挙動がUILabelと異なるため気をつけてください。このようなケースは他にもあると思われます。幾つかのiOSビルトインフォントについては、先述のUIFontのプロパティの値に疑問がある数値が設定されているケースが有るようです。具体的にご紹介します。ヒラギノフォントの場合ヒラギノフォント、すなわちヒラギノ角ゴシックW3/W6、それからヒラギノ明朝W3/W6については以下の様なフォントの設定の特徴があります。leadingの値がきちっと付与されています。lineHeightになります。バグだと思うのですが、descenderの値が本来必要な量の半分しか設定されていません。qなどの下付き部分があるアルファベット文字を描画すると下が途中で千切れてしまいます。leadingを使用するか、または自力でdescender分だけラベルの高さを高くするか、明示的に指定してヒラギノフォントなんて使うのをやめてシステムフォントを使用してください。次にシステムフォントはどうなっているのかというと、以下の様な特徴があります。常にleadingの値がゼロになります。leadingを使うモードで描画しても使わないモードで描画しても全く同じ結果になります。Franciscoが採用されていますが、いずれのケースでも全く同様の設定になっています。gapとして行間が開くような設定になっています。stringでlineSpacingやparagraphSpacingをゼロに設定したとしても、必ず行間がちょっとだけ空いてしまいます。やることはないと思いますが、正確に行間ゼロを作るのは著しく困難です。UIFontのpointSizeについてUIFont.pointSizeについて、みなさん普段から何気なしに17とか14とか値を指定されているかと思いますが、このpointSizeに指定する値の単位って気にされていますでしょうか?このフォントのpointSizeとはPostScriptポイントないしDTPポイントと呼ばれるものらしいです。一般的に1PostScriptポイント=1/72インチとされています。この単位はiOS上で使われている論理座標系のpt単位とは全く違うものなのかというと、どうやら大昔のMacintoshのころからの名残で、macOS/iOS上の論理座標系の1pt=1PostScriptポイントとなるように定められていて、これは現在に至るまで常に維持されているということらしいです。要するに、UIFontのpointSize=iOS上での1ptと完全に一致します。このことはlineHeightが16のフォントを画面上にレンダリングすると論理単位16pt(2倍Retinaなら32pxになる)ことからも確認ができます。8以下のときに常にUIFont.lineHeightと同じ値を返します。heightとなる文化圏があったので誤用されてしまった、ということらしいです。gapを含む下端までの距離」と定義されていますから、このような値では困ります。8以下の場合はCTFontを使ってleadingの値を取得してください。こちらにコードを用意しました。9以上はこの問題は発生しません。8なんてそろそろサポート切れるんで忘れていいかもしれませんが、念のため。まとめデザイナーさんにフォント周りで行間調整がおかしいぞーとかベースラインがずれてるぞーとか突っ込まれまくっていて必死こいて修正方法を調べている時に、こんな記事を見つけました。Designers.このサイトには英字フォントをBaselineではなくcapHeightの位置で上揃えにするべく奮闘した一人の漢の話が書かれています。おお、海外にも私と同じ境遇の漢が居たのです。Layoutするときにfalseにする必要があるものということで皆様記憶されているかと思うのですが、具体的にこのプロパティは何をやっているのかが個人的に全く謎でした。それが今日一つ謎が解けましたのでここに共有させていただきたいと思います。8以上で確認しています)。プロパティから直接操作することが可能になります。Layoutが導入される以前のiOSの世界と同じ状態です。Constraintsが自動的にシステムによってviewに挿入されます。(Required)になります。view.centerの値を直接書き換えても一切無視されるようになります。Constraintsが設定されていない場合、viewのframeはCGRect.zeroになります。Maskとか入っているのでてっきりAutoresizingの仕組みに影響している用に見えますが、実際には全く関係ありません。Constraintsが挿入されてしまいます。Constraintsを挿入するか否かを決めるフラグとして覚えると良いでしょう。Layoutを混載させるときに非常に役立ちます。Layoutに任せるというような荒業が自由自在に可能になります。具体例を見てみましょう。以下の様なニュースを表示する画面を作ってみようと思います。layoutに任せたいというようなケースがあるかと思います。Layoutで作ってみましょう。Warningが発生してしまいます。)")これは先程のUIView.translatesAutoresizingMaskIntoConstraintsについての説明を元にすると以下のように解釈できます。Constraintsが自動的に設定されている。Constraintsが設定されている。これはimageViewを横幅いっぱいに表示するため。自動的に設定されたConstraintsと衝突してしまう。結果としてwarningが発生する。これを回避してやるにはいくつか方法があります。"H:|[imageView]-(0@999)-|"のように設定することで、右側ないし下側のpriorityを999に下げる。することによってUIView.translatesAutoresizingMaskIntoConstraintsによって設定されるConstraintsのpriorityが勝つためワーニングは発生しなくなる。view.width=imageView.widthとなるようにConstraintsを付与する。9以降であればNSLayoutAnchorを使って簡単に設定ができます。Layoutをより自由自在に混載させることが可能になると思います。最近いまさらながらマインクラフトに大ハマリしておりまして。きっかけは友人のマルチプレイサーバーでプレイしたことだったのですが、やっぱり皆で遊ぶゲームは面白いなと再確認している次第です。Beastと呼ばれるオールインワンのランチャーアプリが登場しており、こいつがMODの導入や管理も全て一発でやってくれるため面倒やストレスが一切なく楽しめます。遊んでいたのですが、友人が他のゲームにハマってしまったためマインクラフトのサーバーを立てなくなってしまいました。そこで私のほうで自分でマインクラフトのサーバーを立ててやろうと思い立ちまして早速今週末チャレンジしてみました。ちなみに私インフラに関しては大の苦手で、サーバーをゼロから構築するのは初めてだったりします。大昔新卒の頃にSIerの仕事でちょっと触ったりとか、その後の仕事でちょっと触ったりとかした程度。́・_・`)前置きはこのぐらいにして早速やってみましょう。ホスティングサービスを選定パッと思いつくところだとさくらVPSとAWSが有名ですが、今回は友人のおすすめでConoHaというVPSホスティングサービスを選んでみました。ほとんどさくらVPSと大差ないように見えたのですが、ConoHaのほうがさくらVPSと違い初期費用がかからないらしいです。新しいもの好きですしせっかくなのでConoHaを選択。サーバーのスペック等は以下のようにしました。7.2に3コア2GBメモリで月1750円。マインクラフトのサーバであればこのぐらいの性能で大丈夫なはず。サーバーを起動してsshまで構築したらすぐにインスタンスが起動します。IPが1インスタンスに割り当てられるようで、この点固定IPを用意したりするのが何かと面倒なAWSに比べて楽でした。管理画面もすっきりまとまっていて使いやすく好印象です。キーペアもその場で同時にすぐ作成してくれて手間がかかりません。適当に設定してログイン。root@を付け忘れてssh接続要求に失敗するみたいなよくあるお約束のミスをしましたが、特に問題なくログインできました。サブドメインを用意してDNSを設定してやります。htmlファイルをホスティングできるようにします。7.2に対するインストール自体はこちらのページに従えばすぐにできます。http://nginx.org/en/linux_packages.html後は以下のビギナーズガイドに従って設定を行えば良いのですが、基本的には最初から全て必要そうな設定は用意されているので、/usr/share/nginx/html以下のindex.htmlを適当に編集してやるだけでオッケーです。http://nginx.org/en/docs/beginners_guide.htmlfirewalldを設定するしかしながらnginxを立ち上げただけでは外からアクセスしてもつながりません。これはCentOS(に限らないですが、ほとんどのLinuxのディストリビューションについて)は何らかのファイアウォールがデフォルトで入っているためです。7ではiptablesではなくfirewalldというやつが使われているらしいので、そちらを設定することにしました。http://urashita.com/archives/963http://www.unix-power.net/centos7/firewalld.htmlhttpサービスをpublicゾーンの設定に追加するだけで簡単に外からアクセスできるようになります。iptablesより簡単でいいですね。JavaをインストールするマインクラフトはJavaで動作するので最新版のJavaが必要です。Javaのほうが速そうなのでそちらを使うことにしました。以下のページで紹介されているとおりにすれば簡単にインストールできるかと思います。https://www.digitalocean.com/community/tutorials/how-to-install-java-on-centos-and-fedoraminecraft-serverを立てるいよいよ本題のminecraft-serverです。Serverボタンを押すだけでzip形式で最初から用意されたサーバーセットアップ一式がダウンロードできますので、ダウンロードURLをコピーしておいてサーバー側からwgetして取得しunzipするだけで準備完了です。http://www.feed-the-beast.com/serversunzipして展開した中身のServerStart.batをServerStart.shにして中身を適当に書き換えてやり(主にJVMの起動オプションからヒープに割り当てる量を調整するなど)実行すれば簡単にサーバが立ち上がります。普通に立ち上げるとシェルを専有されてしまうので、screenなど経由でServerStart.shを実行するようにすればいいでしょう。http://www.minecraftforum.net/forums/support/server-support/server-administration/1897274-how-to-use-screen-on-your-linux-minecraft-serverあとはサーバーコマンドで自分をopにでも追加しておけば良いと思います。コマンドを実行すればopを付与できます。その他必要に応じてminecraft-serverの設定ファイルを操作したりgameruleを調整すれば良いと思います。最後に先ほど設定したfirewalldにminecraftサービスを追加して、外からアクセスできるようにすればおしまいです。minecraftはhttpと違ってデフォルトでサービスが用意されていないので、自分でサービスを追加する必要があります。サービスの追加は/etc/firewalld/servicesにxml設定ファイルを追加すればよいです。サンプル代わりにデフォルトのサービスのxml設定ファイルが/usr/lib/firewalld/services以下に配置されているので適当なものをコピーして改造して使えばよいです。minecraftはtcp/udpの25565がデフォルトポートなのでここを開くように設定してfirewalldを再起動すれば外から繋がるようになるかと思います。その他の設定ログローテーションを設定しておかないとディスクがログで溢れて死ぬかと思ったんですが、最初からnginxについてはログローテーションが設定されているため気にしなくてOKです。minecraft-serverについてはどうなるかわかりませんので、必要に応じてlogrotateを設定して対応したほうが良いと思います。https://genchan.net/server/4907まとめいろいろ調べながらで時間がかかりましたが、3時間ほどでゼロ知識の状態からでもマインクラフトのマルチプレイサーバーを立てることができました。現在のところ無事快適に遊べています\(^o^)/こういう自分の趣味嗜好のために技術を勉強すると非常に捗るのでオススメですね。Androidアプリエンジニアやってます。原因を調べるのにずいぶんと苦戦したので備忘録を作ります。調べたのですが、これよりよくまとまっているドキュメントを現状発見できませんでしたので、2019/06/08現在では上記のドキュメントを参照するのがベストだと思います。操作が優れているか否か」を評価点に挙げます。今回の記事は久しぶりの誰得記事です。こちらで紹介されている手法を用いるにはプライベートAPIを操作する必要があるため、おそらく審査に通りません。じこせきにんでお願いします。プロパティを使うことで簡単にアニメーションを実装させることができます。サンプルを書いてみます。Accessから秘密鍵を書き出すときに、「エラーが発生しました。項目を読み込めません。Accessのお世話になることが多いです。複数台のMacで開発を行っている場合は、証明書を認証するための秘密鍵を複数台のMacにインストールする必要があります。今年は2019年となりました。12月7日担当のakisuteです。最近フォント周りについて深く掘り下げる機会がありましたので、その際のメモを残しておこうと思います。地点では存在しないタイトルの通りですが一応補足しておきます。