Bootstrap card 実装
参考サイト
問題card-deck を利用すると縦枠の高さは揃うけど、幅を小さくしても4つ横に表示される
card クラスに col-lg-3 を追加
min-width を設定
Rails ローカライズ i18n
参考記事
gem
サブドメインで言語判断したので
app/controllers/application_controller.rb
before_filter :set_locale def set_locale I18n.locale = extract_locale_from_subdomain end def extract_locale_from_subdomain parsed_locale = request.subdomains.first I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale : I18n.default_locale end
Rails c で I18n.available_locales を確認
$ rails c Running via Spring preloader in process 10001 Loading development environment (Rails 5.2.1.1) irb(main):001:0> I18n.available_locales => [:en, :"es-MX", :fa, :"en-BORK", :tr, :es, :"en-NZ", :ja, :bg, :"zh-CN", :"en-US", :"de-AT", :de, :"ca-CAT", :"de-CH", :fr, :sk, :"pt-BR", :"fr-CA", :nep, :nl, :"en-UG", :"en-IND", :"en-au-ocker", :ko, :"en-MS", :"en-GB", :"zh-TW", :"fi-FI", :lv, :"fr-CH", :"en-SG", :sv, :"en-AU", :uk, :it, :"no-NO", :"en-PAK", :ee, :"en-ZA", :"da-DK", :id, :"nb-NO", :ru, :"en-CA", :pt, :vi, :he, :ca, :pl,
日本語があったのでOK
config> application.rb
//== gemの指示に従う config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s] //==デフォルトを英語にする。 config.i18n.default_locale = :en
その他 config>locales>en.yml jp.yml を作成
そこに記載していく。
ja: devise: sessions: log_in: "ログイン" en: devise: sessions: log_in: "Log_in"
Viewでの記載方法は
tというのがi18nの変数 その中に記載するだけ
<h2><%= t('devise.sessions.log_in') %></h2>
ちなみにrubyは文字列をutf8で内部的に持っているので、このような書き方が可能。
日本だけを見ていたら、マーケットが違いすぎることに最近気づく
デフォルトは英語ですね。
wordpress エラーログ出力
.htaccessに以下の1行を追加
php_flag display_errors On
# BEGIN WordPress パーマリンク <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> //==この一行を追加 php_flag display_errors On # END WordPress
.htaccessは再帰的にしたの階層まで適用されるので、 themeのフォルダ以下に追加すれば良い。
IfModule mod_rewrite.c 以下はWEBサーバーが、ルーティングを決めている.
ワードプレスは独自のルーティングがあるので、それを決めている所
エラーログはありがたい!
ファイルの場所
大抵は、ワードプレスをインストールしたフォルダ直下にあります。 ないときは、隠しファイルを表示してみてください。 必ずあります。
wordpress フィルターフック 調査方法
フィルターフックとは?
定義
フィルターは、WordPress が様々な種類のテキストをデータベースまたはブラウザ画面へ送信する前に、それを変更できます。プラグインは、フィルター API を利用して、指定したテキストをその時点で変更する PHP 関数を実行できます。
なんのこっちゃ? なので解説
よく考えてみよう!
Railsなどはモデルからコントローラーから自分で作成してDBとのやり取りを記述しないといけない。
でもWordPressでは?
そう、画面しか作っていないよね。
基本的にtheme の中に作成していくのでモデルとか記載していないですね。
Railsで言えば、assets(css, JavaScript) とview だけ作るイメージ。
ではルーティングはどうするの?
そう、ワードプレスがテンプレート階層という順位付けがあり、その規定に準じて、ファイル名を命名しないといけない。
それがテンプレート階層
この記事など参考にしてください。 WordPressのテンプレート階層を初心者でも分かるように解説 | lblevery
本日の本命は、フィルターフックです。
まずソースから
navメニュのクラスを削除して、表示中メニューに 'current' クラスを付与するフィルターフック
add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 );
function remove_to_currentClass( $classes, $item ) {
$classes = array();
if( $item -> current == true ) {
$classes[] = 'current nav-item';
} else {
$classes[] = 'nav-item';
}
return $classes;
}
関数定義
<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>
引数
$tag
$function_to_add 引数で指定した関数を登録するフィルターフックの名前。 これはワードプレスが決定しているので、自分では決めれない。基準に沿うものを探そう。
$function_to_add
フィルターが適用されたときに呼び出される関数の名前。 これは自分で命名して関数を記述する。 上記では remove_to_currentClass
$priority
フィルターフックに登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行する。初期値は10.優先順位が低いときは100とかにする。10刻みが利用されることが多い。
$accepted_args
関数が受け取る引数の個数。 上記の場合は2つ 自分で作った関数に引数を2つ渡している。
ここからがポイント
上記の nav_menu_css_class の定義はここ
apply_filters( 'nav_menu_css_class', string[] $classes, WP_Post $item, stdClass $args, int $depth )
apply_filtersは、WordPress コアの関数のなかで呼び出されているので、そのように記述されている
ざっくり言うと、これをadd_filterに置き換えて、functions.phpの中で利用する
引数は4つ
$classes string型の配列
メニューの中の li タグに適用したいクラス string[] の配列になっているのがポイント だから配列で初期化している
$item WP_Post型
現在のメニュー item これは、ダッシュボードで登録されているメニューですね。
$args stdクラス
wp_nav_menu() 関数の 引数ですね。 そもそもNAVバーを表示しているときに、wp_nav_menu() を記述しているはず。 その引数です。
$depth int型
メニューアイテムの深度、paddingに利用する
もう一度書きます。
//フィルターフックは、nav_menu_css_classというワードプレスの関数。 //メニューの<li>タグにクラスを適用する関数 //自分で作った関数は emove_to_currentClass' 引数を2つもっていくよ! add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 ); function remove_to_currentClass( $classes, $item ) { $classes = array(); //$item は WP_Post型だから current というプロパティを持っている。 //もし current だったらクラス名は current nav-itemを当ててね。 if( $item -> current == true ) { $classes[] = 'current nav-item'; //そうでなかったら、nav-item だけ当ててね } else { $classes[] = 'nav-item'; } return $classes; }
Swift API接続注意点1 忘備録 読まないこと!
大切なものは3つ
1-リクエスト
UserRequestと 汎用的に利用できる APIRequestクラスを作成する
2-レスポンス
3-エラー処理
リクエストは表示するだけなので、値を持っていれば良い リクエストでどんなパラメータが必要か? 一覧でよければ、パラメーターは必要ない。 リクエストクラスには、どんな情報が返却されるのかわからないので、リクエストに必要な情報だけ記載すれば良い。 例 url セッション
レスポンスは、保存処理などが走るので、テーブルに応じたモデルを用意しておかなくてはいけない。 WEBのDBもモデルがUser なら struct Userなど同じ名前が望ましい。そこに記載する カラムに当てはまるようなプロパティを書いておく
リクエスト と レスポンスの構造体が必要になる
リクエストを投げる
URLRequestは httpbody というプロパティを持っている
HTTP POST要求など、要求のメッセージ本文として送信されたデータ。だそうです。
そもそもbodyとは ?
HTTPリクエストは3つの部分からなっている
1.HTTPリクエストライン(リクエストライン)
2.HTTPリクエストヘッダ(ヘッダ)
改行、空行が入る
3.HTTPリクエストメッセージボディ(メッセージボディ)
POSTのとき、受け渡すパラメーターの内容が書いてある。 GETのときは何も書いていない。 今回はログインだからBodyに書いてあるはず。
encode とは Swiftの型-> json
decodeとは json-> Swiftの型 へ変換するもの
それぞれData型で返却される
下記参照
developer.apple.com ちなみに encodeはこちら
ここのソースはわかりやすい
//まず構造体を定義 これがbody部のもととなる struct GroceryProduct: Codable { var name: String var points: Int var description: String? } //ここで上記のインスタンスを生成 let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.") let encoder = JSONEncoder() //これはただ、出力を読みやすくするだけ、必要ない encoder.outputFormatting = .prettyPrinted //encodeします。このときエラー処理が必要 try let data = try encoder.encode(pear) print(String(data: data, encoding: .utf8)!) //こんな感じで、body部が出来ている。 /* Prints: { "name" : "Pear", "points" : 250, "description" : "A ripe pear." } */
jsondecodeのインスタンスを作らないと何も始まらない。
urlRequest.httpBody = try! encoder.encode(httpBody)
とすると cannot invoke ~ 呼び出せないよとエラー
ここを見ると、ジェネリクスで作れと書いてある。よって変更する。 プロトコルのジェネリクスってどうやってかくの?
associatedtype を使いなさいと。
protocol GitHubRequest{ //プロトコルでのジェネリクス associatedtype Response: Decodable //ここでジェネリクスを指定 associatedtype HTTPBody: Encodable //直接アクセスできないようにGetterがある var baseURL: URL {get} var path: String {get} var method: HTTPMethod {get} //URLQueryItem URLのクエリ部分からの単一の名前と値のペア。 var queryItems: [URLQueryItem] {get} //HTTPBody型に変更 var httpBody :HTTPBody {get} } case .post: let encoder = JSONEncoder() //associatedtype HTTPBody: Encodable これによりここのエラーが消える urlRequest.httpBody = try! encoder.encode(httpBody)
DNSレコードの種類や文言まとめ
DNSレコードの種類や文言まとめ
Aレコード
アドレスレコードのこと
hogehoge.com IN A 192.168.22.30
このドメインのIPアドレスは192.168.22.30ですという意味
WEBブラウザなどからの問い合わせに対して、このドメインは、ここですよとDNSが、返してくれる。
CNAMEレコード
Canonical Name 正規名のこと
ドメインを別のドメインに置き換えるレコード
www.hogehoge.com IN CNAME hogehoge.com
NSレコード
ドメインが管理されるサーバー DNSを記述したもの
hogehoge.com IN NS ns01.jp
SOAレコード
ざっくり説明すると
ドメインの情報が記載されているレコードだと思えば良い。
【ドメイン名】 【クラス名】 SOA 【DNSサーバのドメイン名】 【連絡先】 ( 【シリアル番号】 【更新チェックの間隔】 【リトライ間隔】 【問い合わせ諦めるぜ期間】 DNSがゾーンファイルが新しくなったかどうか確認するのを諦める時間 【ネガティブキャッシュの有効期限】 )
digコマンド
ドメイン名からipアドレスを調査できる nslookup と同じ感じ
dig hogehoge.com //ドメインから調査する dig -x IPアドレス //IPアドレスからドメインを調査する
参考サイト