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)

}

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

 

 

 

Rails GoogleのAPIで表示したデータを保存する

APIのデータは取得した型でそのままコントローラに送るとエラーになります。

f:id:happy_teeth_ago:20180614122754p:plain

nilが渡ってしまう。

リンクしたときに、DBに保存したい。

createを呼ぶべき。createはpostなので、formを利用しないといけない。

<div class="w3-row-padding w3-padding-16 w3-center">
<%= @books.each do |book| %> <//ここでもらった仮引数を詰め込みます。
<%= form_for(book) do |f| %>

<div class="w3-quarter">
<%= book.title %>
<%= book.author %>
<%= book.publish %>
<%= book.published %>
<%= link_to image_tag("#{book.image_link}"),
new_book_path(book) %>
<%= f.hidden_field :title %>
<%= f.hidden_field :author %>
<%= f.hidden_field :publish %>
<%= f.hidden_field :published %>
<%= f.hidden_field :image_link %>

<i class="fas fa-pencil-alt"><%= f.submit value="シェアする"%></i>
</div>
<% end %>
<% end %>
</div>

formタグは、hiddenにできます。とりあえずformタグを利用することが大切。

DBに保存する必要はないです。indexは取得するだけなので、

eachともちろん併用できます。each文の中で回さないと意味がないです。仮引数でループ回していくので。

 

標準のscafforldingを見て参照すると良い。//=>大切です。

_from.html.erbを参照する。 

そこには、このように記載してあります。

<%= form_with(model: book, local: true) do |f| %>

 formを回しなさいということですね。

 

form_forを確認すると、

form_for(モデルオブジェクト [, オプション]) do |f|
end

第1引数はオブジェクト名、第2引数は?

モデルにオブジェクトが入っていれば、それを保存するというのがfromの仕様になっているよう。なので、値を入れておかないといけない。

@booksに入っているのがGoogleAPIの型になっている。

 これが1番の問題。

これを解決するために、取得したあと、DBに書き込まずにモデルだけ作るのはどうか?。行けそうである。

mapを利用する。一度に変換してしまう。

なんて素晴らしいmap!

すべてがオブジェクトのRubyも素晴らしい!

 

def index
@books = GoogleBooks.search(params[:search],{:count => 20}).map{|googlebook| book = Book.new
book.title = googlebook.title
book.author = googlebook.authors
book.publish = googlebook.publisher
book.published = googlebook.published_date
book.image_link = googlebook.image_link
book
}
end

一度mapの中で変数に入れないといけない。仮引数をgoogleBookにします。

Book.newはスタティックな値なので大文字。

あとは値を詰め込むだけ。

mapの中で返却しないといけない。

なのでbookは必要です。

ストロングパラメータでないと、ハッシュは詰め込めないので、別途ストロングパラメータを設定しておく。

 

ポイントは

1-GoogleBookのモデルを、ActiveRecordの型でオブジェクト作り直しました。

もうオブジェクト作ったので、formも簡単に作れます!

2-createはpost。そのためには、formが必要なのでformを作成しました。

 

 

 

Ruby (Rails) ハッシュの書き方まとめ

ハッシュの書き方をまとめておきますね。

railsでよくある

params[:id]

これはなんなのか?

 

Railsで使われるparamsとう変数のidというkeyにアクセスしているのです。

そして、これは多くは、Railsでは、Viewからコントローラへ値を渡すときに用いられます。

 

まず基本のハッシュの書き方から説明しますね。

配列は

str = [1,3,5,6]

というふうに値が一つづつ入っていますね。

これをキーと値というもので2つ一組でセットで入っているものがハッシュといいます。

便利ですね。配列は[ ] で要素を囲みますが、ハッシュは{ } で要素を囲みます。

 

str = {"name" => "Ichiro", "age" => 28}

nameにはIchiro ageには28があります。

これが全体として、一つの値なので一つの変数 strに詰め込むことができます。

 

アクセスするときにはキーを指定します。

 

str["name"]  // => Ichiro が取得できます

 

ハッシュはすべて文字列になるのでそこだけ注意!

 

でもって

ハッシュの書き方の続きです。

{"name" => "Ichiro", "age" => 28}

このハッシュは

シンボルというものを利用してこのようにも欠けます。

シンボルは :コロンを利用した書き方の事です。

 

{:name => "Ichiro", :age => 28}

 

ただ""を:に置き換えただけですね。

でも""で囲まななくていいので、書くのは楽です。

さらに

 

{name: "Ichiro", age: 28}

 

コロンをキーの後ろに持ってくると =>も省略できます。

これは楽!!

だからこのように書くことが多いのです。

では、また