nodeのインストール MAC編

nvmとはnode.jsのバージョン管理ツール。 node version managerのこと

node.jsとはサーバー側で動くJavaScriptのことです。

コマンド brew install nvm

zshrcへpath追記

vi ~/.zshrc

//=== 下記を追加 patを通した
  export NVM_DIR="$HOME/.nvm"
  [ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"  # This loads nvm
  [ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm"

NVM 最新版へ

//最新版をインストール
%nvm install stable

% nvm --version
0.35.3
% nvm use 14.7
Now using node v14.7.0 (npm v6.14.7)
% nvm --version
0.35.3
% node -v
v14.7.0

インストール可能なリストを表示

$ nvm ls-remote

//==このLTSをインストールする long term support の意味
   v10.15.3   (LTS: Dubnium)
       v10.16.0   (Latest LTS: Dubnium)
        v11.0.0  


$ nvm install 10.16.0

//これを設定しておかないと再ログイン時にバージョンが無効になってしまう。
$ nvm alias default v10.16.0

nvm ls で現在入っているバージョンを確認できる

$ nvm ls
        v8.16.0  
->     v10.16.0  
         system  
default -> v10.16.0
node -> stable (-> v10.16.0) (default)
stable -> 10.16 (-> v10.16.0) (default)
iojs -> N/A (default)
lts/* -> lts/argon (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.16.0
lts/dubnium -> v10.16.0

npm はアプリを管理するツール

これでnode のアプリをインストールしていく。

nodeをインストールしたらnpmもインストールされている 念の為updateしておく。

 $ npm update -g npm

aglioのインストール

npm install -g aglio

Swift Delegate カスタムセル 実装処理

delegateについて記事を探したが、一般論でしかなく理解し難いのでまとめておく

やりたいこと

TableView Cellの中のbutton で画面遷移したい。delegate利用

理由:通常ならデリゲートメソッドを利用する。
しかし、xibファイルの中に自分が実装したボタンがあり、ボタン押下時に画面遷移したい。
そのときに選択したセルのオブジェクトも持っていきたい。

通常ならセル選択時に呼ばれるメソッドを利用。これ

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

しかし,xibファイルはこれ

f:id:happy_teeth_ago:20190530082902p:plain

xibファイルのボタン押下を取得するために,delegateを自作。

まずプロトコル 今回は、セルのindexPath を次画面で利用したいため、引数に渡してあげる。

protocol UseSegueDelegate {

//この関数は、delegateを任された側のクラスで、実装しないといけない。
    func moveView(_ index: IndexPath)

}

ちなみに、プロトコル名は○○delegateのほうがわかりやすい。

処理を任せる側 xibファイルのクラス

//DayListCellクラス
//引数用のプロパティ
   var index:IndexPath?
//これが無いと、delegateメソッドが利用できない。
    var delegate:UseSegueDelegate?
    
    @IBOutlet weak var count: UILabel!
    
    @IBOutlet weak var dayLabel: UILabel!
    @IBAction func btn_NextPage(_ sender: Any) {
            delegate?.moveView(index!)
    }

実装するクラス tableviewのあるクラス

  //delegate
    var index:IndexPath?
    
    // PlanListControllerからの画面遷移時にデータを持ってくる
    var plan: Plans?
    //日付表示用
    var planDays: [Days]?


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルを取得する 先程のxib ファイルにキャストする
        let cell: DayListCell = tableView.dequeueReusableCell(withIdentifier: "DayCell", for: indexPath) as! DayListCell

//日付表示用        
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ja_JP")
        formatter.dateStyle = .medium

        // セルに表示する値を設定する
        let date = planDays![indexPath.row].day
        cell.count.text = "\(String(planDays![indexPath.row].day + 1)) 日目"
        let dateComponents = DateComponents(day: Int(date))

        //datecomponents でday を指定しているのでその分増えていく 1-足す時間 2-開始時間
        let showDay = Calendar.current.date(byAdding: dateComponents, to: plan!.start_date!)
        cell.dayLabel.text = formatter.string(from: showDay!)

        //xibファイルのdelegateには、このコントロラーを渡す
        cell.delegate = self
//ポイント ここでdelegateのプロパティにTableViewのindexPathを詰め込んでいる
        cell.index = indexPath
        return cell
    }

上記のポイントの箇所により - プロトコルのプロパティ indexにこのTableViewのindexPathが詰め込まれる - プロトコルのメソッド func moveView(_ index: IndexPath)が呼ばれる これはセルのなかのボタン押下時に呼ばれる。indexpathが詰め込まれている
- その後同じクラスに実装しているmoveViewが呼ばれる

  func moveView(_ index: IndexPath) {
        //self.index= このクラスのプロパティ
        self.index = index
//segueを呼ぶ
        performSegue(withIdentifier: "toFoodList", sender: nil)
    }


//上記performSegueにより呼び出される
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "toFoodList") {
            let subView = (segue.destination as? FoodListControllerTableViewController)!
            // modify
            subView.day_int = self.plan?.days
//ここでindexが利用できる。 このプロトコルを実装していないと、[index!.row]を記載するとエラーになる。
//プロトコルを実装したために、エラーにならない。
            subView.day = self.planDays![index!.row]
        }
    }

wordpress 納品 忘備録

ロリポップはWP-mailプラグインを入れないと、フォームからお問い合わせができない

f:id:happy_teeth_ago:20210413175701p:plain

メール設定はこちら

lolipop.jp

f:id:happy_teeth_ago:20210413180924p:plain

All-in-One WP Migration

を利用する

利用するときは他のプラグインを停止しておく

参考サイト

www.vektor-inc.co.jp

管理画面関係でプラグインを利用できなくしておく。

壊れてもこちらが直さいないと行けないので

最近はuploadの際に別のプラグインが必要 f:id:happy_teeth_ago:20190517181537p:plain

//   管理画面でプラグインを非表示
function remove_menus(){
    // プラグインを非表示
  remove_menu_page ('plugins.php');
  //テーマも非表示
  remove_menu_page( 'themes.php' );               
  //設定のパーマリンク非表示              
  remove_submenu_page( 'options-general.php', 'options-permalink.php' );
  //ツール非表示
  remove_menu_page ('tools.php');         
  
}

最大uploadサイズ変更時は、wp-config.phpを編集

権限確認しておく事 600で良い 下記を追加

@ini_set( 'upload_max_filesize' , '128M' );
@ini_set( 'post_max_size', '128M');
@ini_set( 'memory_limit', '256M' );
@ini_set( 'max_execution_time', '300' );
@ini_set( 'max_input_time', '300' );

ロリポップssh接続 

ここを参照

ロリポップcoda2接続方法 - happy_teeth's 忘備録

swift model作成 インスタンス作成がいまいちわからない方へ

モデルを便宜的に、表示するためだけに作成したのでまとめ

initはインスタンス生成時に自動的に呼ばれるメソッド

struct PlanList{
    let days:Int
    let date:Date
    
    init(days:Int ,date:Date){
        self.days = days
        self.date = date
    }
}

メンバ変数で宣言

   var planlists: [PlanList] = [PlanList]()

Viewが表示されたときに、インスタンスを作成

  override func viewWillAppear(_ animated: Bool) {
        
//    plan!.daysは前画面から引き継いだオブジェクト
        for num  in 0...Int(truncatingIfNeeded: plan!.days ) {
            //カレンダclass 調査 加算 減産
            let planlist = PlanList(days: num, date: plan!.start_date!)
            //planlistsをテーブルに表示
            planlists.append(planlist)
            
        }
        
    }

ただこれだと、オブジェクトを表示しているだけなので、Coredataに永続的に保存されていない。 次回永続化について記載します。

わかりにくい点がありましたら、コメントお願いします。 修正したいと思います。

Swift CoreData 小テーブルオブジェクト生成

Swift CoreData 小テーブル作成の記事がほとんどなかったので記載

テーブル関係はこう

PlansがDaysを1対多でもっている

f:id:happy_teeth_ago:20190517135227p:plain

ポイントは days_re が一つの変数のように扱うところ。

NSSet にNSMutableArray はセットできない。CoreDataがObjective-Cで書かれているので仕方がない。

よってこれしかやりようがない。

//ボタン押下で子テーブルを入力値分作成
 @IBAction func btn_registration(_ sender: Any) {
        
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        
        let plan = Plans(context: context)

        //小テーブルを入力値分 作る
        let num:Int! = Int(planDays!.text!)

        for _ in 0...num{
//小テーブルのインスタンスをcoredataで作成し
            let day = Days(context: context)
//親planテーブルに追加する。
           plan.days_re = plan.days_re?.adding(day) as NSSet?
        }
       
        
        plan.name = planName.text
        //開始日付を取得して保存
        let date = Date()
        plan.start_date = date
        do {
            try context.save()
        }catch{
            print(error)
        }

        //画面遷移
        dismiss(animated: true, completion: nil)
    }

WordPress comments.php 表示されない

comments.phpが、本の通りに表示されない問題。

参考にさせていただきました。こちらのサイトのほうが良いです。
コメント欄を表示するcomments.phpを作る [WordPressテーマ作成の手順16] | *Web Design 覚え書き*

ポイントは、comment_form( $args ) 引数に配列を渡すところ

comment_form 関数定義

f:id:happy_teeth_ago:20190517131048p:plain

基本、引数には配列を渡す。さらにfields は配列になっている。

これも、配列のまま記載してあげる。 WordPress5.0からは記載しないと動かなかった。

f:id:happy_teeth_ago:20190517130827p:plain

リファレンスはこちら

wpdocs.osdn.jp

結論

//引数を用意
<?php $args = array(
    'title_reply' => 'Leave a Comment',
    'label_submit' => 'Submit Comment',
    'comment_notes_before' => '<p class="commentNotesBefore">入力エリアすべてが必須項目です。</p>',
    'comment_notes_after'  => '<p class="commentNotesAfter">内容をご確認の上、送信してください。</p>',

    //ここが問題のfieldsの箇所、配列を渡して全て記載する
    'fields' => array(
            'author' => '<p class="comment-form-author">' .
                        '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' placeholder="*your name" /></p>',
            'email'  => '<p class="comment-form-email">' .
                        '<input id="email" name="email" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . 'placeholder="*your email" /></p>',
            'url'    => '',
            ),
    'comment_field' => '<p class="comment-form-comment">' . '<textarea id="comment" name="comment" cols="50" rows="6" aria-required="true"' . $aria_req . ' placeholder="*COMMENT" /></textarea></p>',
    );

//comment_form を呼び出す
comment_form( $args ); ?>

Bootstrap4 ul li 中央揃え 忘備録

flexboxがとても便利 参考にさせていいただきました。

www.webcreatorbox.com

 <div class="collapse navbar-collapse" id="navbarToggler">
//ここにw-100を入れたら、画面いっぱいに広がる。
//ulには d-flex を適用
            <ul class="nav navbar-nav d-flex w-100">

//li にはd-inline-flex で均等割
              <li class="nav-item d-inline-flex active">
                <a class="nav-link" href="#">Home</a>
              </li>
              <li class="nav-item d-inline-flex active">
                <a class="nav-link" href="#">入学案内</a>
              </li>
              <li class="nav-item d-inline-flex active">
                <a class="nav-link" href="#">教育</a>
              </li>

本家サイト

getbootstrap.com