Ruby フォーマット文字列について

2.345などの少数が出た場合文字の表示を整えたい場合がある。 その場合に利用するのが、フォーマット文字列 例えば 1.2を 1.200と表示させたい場合以下のように記載する。

Rubyの場合

sprintf('%.3f', 1.2)

#=> "1.200" と表示されます。

このsprintfというメソッドで整えます。 また%は指示子といって.3は小数点以下3桁まで表示しましょうねということ。
第一引数の小数点の右の数字は小数点以下は3桁まで表示しましょうねという意味。 0.3ではないので注意。
そして、第二引数の値 1.2 の表示を整えています。

rubyにはフォーマット文字列 % というのもあります。 基本形はこれ

str % 引数

となっています。
左辺の文字列strを% の右辺の引数の値を表現します。


'%.3f' % 1.2
#=> "1.200"と表示されます。

この文法は

%fはfloatの略、つまり少数ですね。
%dだと10進数の普通の数字となります。
%oだと、8進数で出力となります。
%s だと文字列を出力します。
%gは実数を最適な形で出力します。
では

'%8.3f' %1.2

の8は何かと言うと[全体の文字の幅]です。 指定しなくてもいいし、指定してもいい。 桁数の前に0詰めするとわかりやすいです。

'%08.3' % 1.2

これは  
0001.200 と表示されます。

Swiftの場合

print(String(format: "%.3f", 1.2)

#=>1.200と表示される。

String型に型変換するときに formatで整えるのですね。

SWIFT Storyboardのsegueで遷移先に値を渡す(テーブルで選択した値)

segueで値を引きわたす。モデルで。 まずテーブルのセルが選択されたときの処理は、このメソッドデリゲートメソッドが呼ばれます。

送付元のクラスのテーブルで表示されている、DBの値をモデルごと渡す

送付先のクラスで、表示します。

送付元のクラスでの実装

まず送付元のクラス
  // メンバ変数 送付するモデル
    var send_person:Person?  //PersonはCoreDataのテーブル テーブルも型になる。

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //選択行のpersonsを取得して詰め込み
        send_person = persons[indexPath.row]
        performSegue(withIdentifier: "detailSegue", sender: send_person)
    }

セル選択行をsend_personに詰め込みます。 それをperformSegue実行時に、senderで渡します。 ちなみにpersons[indexPath.row]で選択セルのデータが取得できますね。 配列に詰め込まれているのが、ループ処理みたいにされて、テーブルに表示されているわけですから、、、

    //モデルまるごと送っています。
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "detailSegue"{
            let subView = segue.destination as! detailViewController
            subView.person = send_person!
        }
    }

"detailSegue"はStoryBoadで画面を結んでいる線のプロパティに値を設定しておく必要があります。 f:id:happy_teeth_ago:20180623022939p:plain

送付先のクラスの実装

subView.personは当然、送付先クラスで宣言しておかないといけませんね。 ここでは、var person = Person()になります モデルごと送ると、遷移先でデータ表示するときが楽ですね。

   //受け取り用のインスタンス
    var person = Person()

   override func viewDidLoad() {
        super.viewDidLoad()
        
        person_name.text = person.name
        person_reading.text = person.reading
        person_birthday.text = person.birthday
        person_dead_day.text = person.deadday
  }

モデルでpersonごと渡しているのでモデルのプロパティにアクセスして、詰め込むだけです。 ここではpersonというモデルを渡しているということです。 わかりにくい点や間違いがありましたら教えてください。

SWIFT 関数 外部引数名と内部引数名について

Swiftの外部引数と内部引数についてまとめる。 関数を呼び出すときには、外部引数名を利用します。 まず関数定義から

func party(user: String, to group:String){
  print("\(user)さんは、\(group)のパーティに招待されています")
}

ここでまず引数が2つありますね。 " , "で分けてあります。

引数の1つ目は user 、型はString型

引数の2つ目は " , "よりあとですがここでは、外部引数名、内部引数名、型 で表現されています。

外部引数名が to 内部引数名が group 型がString型
この関数の内部で利用するときは、内部引数名を利用します。 group ですね。

関数内では,"\(group)"のように利用されています。


これは変数展開で " ~ " の中はすべて文字列として表示されますが、swiftの場合  \( 変数 )  と書くと文字列の中でも、変数を変換してくれて出力してくれるものです。


話がそれましたが、party関数の第二引数には、外部引数名 toが明記されています。

よって関数を呼び出すときには、この外部引数名を利用します。引数ラベルとも言います。

関数を呼び出す時

party(user: "Fujiwara", to: "サンフレッチ")

そう少し違和感があるかもですが、関数を呼び出すときは、

外部引数名 to を利用します。

これを実行すると

Fujiwaraさんは、サンフレッチのパーティに招待されています。

と表示されます。 以上関数呼び出し時の引数についてまとめました。 他にもイニシャライザの呼び出し時には、外部引数をすべて表示しないといけなかったり いろいろとあります。 一番使用頻度の高いと思われるものをまとめてみました。 以上

なぜbundle exec rails db:migrateなのか

どうしてbundleが必要なのか調べたのでメモ bundle execは、現在のバンドル(ディレクトリのGemfileからのもの)のコンテキストでスクリプトを実行するためのBundlerコマンド。

実は、bundlerもgemの一つ rails db:migrateはスクリプトで、dbは名前空間で、migrateは定義されたタスク名。 したがって、exec rake db:migrateをバンドルすると、現在のバンドルのコンテキストでdb:migrateコマンドを使ってrailsスクリプトが実行されます。

詳しくはbundlerの本家サイトを見てください

場合によっては、実行可能ファイルがすでにシステムにインストールされ、競合しないなら問題なく利用できます。 将来、または別のマシンで動作しない可能性があります。 これはデプロイ時に動かくなくなる可能性もあるということ。 これはあまりにリスクが高すぎる。 よってめんどくさくても, bundle execは必ず書きましょう! 以上

xcodeでGithubからpullする方法

xcodeでGithubからpullする方法がなかなか書いていなかったので、自分でまとめてみました。 条件 1) すでにGitHubにリポジトリがあり、そこからpullするときの話

2) Xcode9.4.1

3) まだマイクロソフトに買収されたばかりで、操作性の良いものがGitHubで提供されている状態。->これからスカイプのように、操作性は、どんどん悪くなると思われる。他のサービスの利用も準備しておかないといけない。

f:id:happy_teeth_ago:20180620075752p:plain

プロジェクトナビゲーターの上のアイコンの左から2つ目 これがgit関係を管理するところ

右クリックにてadd exsiting Remote

f:id:happy_teeth_ago:20180620080405p:plain

それぞれの値を入力します。 f:id:happy_teeth_ago:20180620080519p:plain

最後にGitHubのユーザー名とパスワードを求められるので入力。

最初からリポジトリ作成してpushする場合はこちらの記事

seeku.hateblo.jp

がいいと思いました。 以上。

RailsでGoogleMapを表示させる

 gem 'gmaps4rails'の使い方 の手順をまとめてみた。

やりたいことはこれ f:id:happy_teeth_ago:20180619174729p:plain

エラー cannot load such file -- coffee_script

公式サイト

github.com

いきなりエラー cannot load such file -- coffee_script

idがかぶるとありえない。だめ JavaScriptが意図しない動きになる。 原因 あちこちsubmitがある。 理由 画面が別れていてもどこの画面であっても問題ない。パーシャルになっていても同じ画面ならファイル違っていてもJavaScriptなので、submit取得できる。

住所表示ボタン

 <%input id="submit"class="btn btn-primary" type="button" value="住所をを表示">

formのsubmitは

  <%= form.submit %> 

これらは別物である。

気を取り直し、コントローラのソースを見る.

  def index
    @datperson2s = Datperson2.all
    @hash = Gmaps4rails.build_markers(@datperson2s) do |user, marker|
      marker.lat user.latitude
      marker.lng user.longitude
    end    
  end

はじめ理解できなかった。これRubyは引数の()を省略できる。

 marker.lat(user.latitude)

これと同じである。

marker.latは 関数のようである。 リファレンスのここでチェック。

Google-Maps-for-Rails/markers_builder.rb at master · apneadiving/Google-Maps-for-Rails · GitHub

51行目付近にある。

def lat(float)
@hash[:lat] = float
end

セッタのようになっている git で公開しているものはソースで確認すること!

HTMLに組み込む時、ERBではコピペで組み込める。slimを使う意味がわからない。HTMLからすべて作る場合はいいかもしれない。

リファレンス確認しながら進める。

1)gemはok

2)HTMLも書いた

見つからなければエラーになるので大丈夫

3)JavaScriptはapplication.html.rbに記載した

もともとあったのがおかしかった 文字がエスケープされていた

4) Javascript source code

アセットパイプラインに入れないといけないので sprocketというjemに書き出される

アセットパイプラインとは

JavaScriptやCSSを最小化して連結するフレームワーク gem 'sass-rails' gem 'uglifier' gem 'coffee-rails'

これらのgemを利用する よってコーヒー使わなくてもコヒーを削除してはいけない ただコーヒーファイルをjsに変更するだけでよい。

ウエブページをレンダリングする際に、リクエストをへらすことができる

If you don't have asset pipeline, you'll need to import the js OR coffee files: rails g gmaps4rails:copy_js

rails g gmaps4rails:copy_coffee アセットが無いならこれを使いなさい あるからいらない

5) Javascript code:

スクリプトタグの中に書いた グーグルはコメントした

handler = Gmaps.build('Google');
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
  markers = handler.addMarkers([
    {
      "lat": 0,
      "lng": 0,
      "picture": {
        "url": "http://people.mozilla.com/~faaborg/files/shiretoko/firefoxIcon/firefox-32.png",
        "width":  32,
        "height": 32
      },
      "infowindow": "hello!"
    }
  ]);
  handler.bounds.extendWith(markers);
  handler.fitMapToBounds();
});

6) Add options: グーグルのオプションを利用したいときはこのようにする

Generating JSON これはコントローラに書いている

@users = User.all
@hash = Gmaps4rails.build_markers(@users) do |user, marker|
  marker.lat user.latitude
  marker.lng user.longitude
end

ここでビューに渡している In your view:

これを利用して、上記を書き換えた。 これがコントローラーからviewへ値を出力しているところ。

このアプリでは、MAPをいろんなところから読み込むので ハッシュに入っていないと表示できない indexはいい。もう詰め込んであるのを表示するだけなので。 editでは,addmarkerを呼んであげないといけない。グーグルの関数で動的にやっていかないといけない。

エラーfirstchildがnill 一度railsのサーバーを再起動してみる。これは イニシャライズで読み込まれたり、アセットパイプラインを変更した場合エラーが治る可能性があるためである。 ここを見ると、DOM構築後に読み出さないといけない。読み込みのタイミングだけの話 https://github.com/apneadiving/Google-Maps-for-Rails/issues/534

onloadの書き方。ここをみて修正 https://developer.mozilla.org/ja/docs/Web/API/GlobalEventHandlers/onload

普通はクリックするとページが切り替わる。 ターボリンク使うと中身をAjaxが全部書き換えている 実際にはページ遷移していないのでページ書き換わらない。 そのタイミングでJavaScriptを走らせる

document.addEventListener('turbolinks:load', function() {
});

このgemは一体なんなのか?railsのコントローラとviewを簡単につなげてくれるgemである。 editではjavascriptで動的に追加しないといけない

フロントでJavaScriptで詰め込まないといけない。取得したものをinnerHTMLで入力か? 位置情報の修正はjavascriptで行うしか無い。 以上!

Swift オプショナルバインディングとは

オプショナルバインディングについてまとめます。

まず、なぜ存在するのか?

条件分岐や繰り返し処理のときにオプショナル型にnilが入っていたら処理を分けたいときがあります。そのときに値の有無に応じて処理を分けます。

if  ~ let文を利用します。

 

if let 定数名 = オプショナル型の値 {

   値がある場合の処理

}else {

  値がない場合の処理

}

 

これが基本の書き方

例文

if let _ = str {

print(str)

}

なにこれ?

と思うかもです。まとめます。

 

var str:String?

if let a = str {

print(str)

}

オプショナル型のstrが宣言されています。

a には strを代入してね。その値があるときにはstrを出力しましょう。

という意味です。

しかし、毎回aなどの利用しない変数を宣言するのは、良くないので

引数名を省略したいときには Swiftでは _ が利用できます。

それを利用しています。

だから

if let _ = str {

print(str)

}

こうなります。_ はただ、引数名を省略しているだけですね。