HTMLのtableでできないこと
jQueryのslideUpの挙動
jQueryのslideUpを使うことで、ふわっと上に向かって要素を消すことができる。
しかし、table要素ではslideUp等のdom操作が正常に使えない。消えるのは消えるが、過程のふわっと消える感じを出さずに最後の「display:none」の付与のみ正常に動作する。
cssの設計規則BEMのマニュアル
block__element--modifier のように, blockとelementはアンダースコア2つで区切り, elementとmodifierはハイフン2つで区切る. blockが複数単語になる場合は, 単語と単語の間はハイフン1つで区切る. element, modifierが複数単語になる場合も同様である.
これはC言語的なモジュールと言う解釈でOK?
アセンブリでfizzbuzz
.set LOOP_END, 60 .set LOOP_START, 1 .set FIZZBUZZ_NUM, 15 .set FIZZ_NUM, 3 .set BUZZ_NUM, 5 .set EXIT, 60 .set EXIT_CODE, 1 .data fizz: .string "Fizz" buzz: .string "Buzz" fizzbuzz: .string "FizzBuzz" num_str: .string "%d\n" end_string: .string "\nComplete FizzBuzz!!" .text .globl main fizz_write: leaq fizz(%rip), %rdi call puts@PLT jmp loop_inc buzz_write: leaq buzz(%rip), %rdi call puts@PLT jmp loop_inc fizzbuzz_write: leaq fizzbuzz(%rip), %rdi call puts@PLT jmp loop_inc num_write: leaq num_str(%rip), %rdi movq %r13, %rsi xor %rax, %rax call printf@PLT jmp loop_inc loop_process: cmpq %r13, %r12 jl end_process movq $0, %rdx movq %r13, %rax movq $FIZZBUZZ_NUM, %r14 divq %r14 cmpq $0, %rdx je fizzbuzz_write movq $0, %rdx movq %r13, %rax movq $FIZZ_NUM, %r14 divq %r14 cmpq $0, %rdx je fizz_write movq $0, %rdx movq %r13, %rax movq $BUZZ_NUM, %r14 divq %r14 cmpq $0, %rdx je buzz_write movq $0, %rdx movq $0, %rax jmp num_write loop_inc: inc %r13 jmp loop_process main: movq $LOOP_START, %r13 /* r13をloopカウントにする */ movq $LOOP_END, %r12 jmp loop_process end_process: leaq end_string(%rip), %rdi call puts@PLT movq $EXIT, %rax /* exit */ movq $EXIT_CODE, %rdi syscall ret
やねうらお産の記事?
面白そうな記事があったので、後で見る
いま動画編集界隈でアバターをグリーンバックにしてクロマキー処理をする時に緑が輪郭に僅かに残る問題が話題になってるみたいなんだけど、例えばFaceRigなら黒背景にしたのと白背景にしたのをリプレイから書き出してフレーム単位で差分を取ればα値が算出できるような…?https://t.co/MJjMwroMOs
— やねうら王 (@yaneuraou) July 13, 2020
PHPQueryを使ってみる
PHPでスクレピングをする上で便利なPHPQueryを使ってみる。
composerからダウンロード
composer require electrolinux/phpquery
使い方
<?php require("vendor/autoload.php"); $content = file_get_contents("https://follow.yahoo.co.jp/themes/059a2c12855188c97004"); $pq = phpQuery::newDocumentHTML($content); $ul = pq($pq)->find("ul.detailBody")->eq(0); $results = []; foreach ($ul->find(".detailBody__item") as $li) { $o = pq($li); $link = $o->find(".detailBody__wrap:first")->attr("href"); $results[] = $link; } var_dump($results);
AdnroidのFragmentのonAttachについて
FragmentのonAttach(Context context)
メソッドは、FragmentがonCreate
メソッドで作成されるよりも前に呼び出される。
具体的には、「このFragmentはどのActivityにくっつければ良いか?」を決めるためにonAttach
メソッドはある。
参考:Fragment | Android デベロッパー | Android Developers
デフォルトでは、呼び出されたActivityにAttachされる
AndroidでFragmentを使う時のサンプルコード
Androidアプリを制作する際に、Fragmentを使った時のメモ。
Fragmentとは?
Fragmentとは、サブActivityみたいなもので、画面を描写したりクリックイベントを感知したりできる。公式ページに以下の様に書かれている。
Fragment は、FragmentActivity でのユーザー インターフェースの挙動や部位を表すものです。1 つのアクティビティに複数のフラグメントを組み合わせてマルチペイン UI をビルドしたり、複数のアクティビティでフラグメントを再利用したりできます。フラグメントとは、アクティビティのモジュラー セクションのようなもので、独自のライフサイクルを持ち、独自の入力イベントを受信します。フラグメントはアクティビティの実行中に追加したり削除したりできます(別のアクティビティで再利用できる「サブ アクティビティ」のようなものです)。 参考:フラグメント | Android Developers
サンプルコード
まずは、Mainactivityの部分。
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.os.Bundle; public class RssReader extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if(savedInstanceState == null){ FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.addToBackStack(null); int count = 0; fragmentTransaction.replace(R.id.container,Fragment01.newInstance(count) ); fragmentTransaction.commit(); } } }
ポイントは、2つある。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentManagerとは、Fragmentを管理するClassのことで、Fragmentの追加や削除、どのFragmentを画面に描写するかなどの処理をしてくれるもの。こいつを使う時にはgetSupportFragmentManager()
関数を使って呼び出すことになる。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.addToBackStack(null); int count = 0; fragmentTransaction.replace(R.id.container,Fragment01.newInstance(count) ); fragmentTransaction.commit();
そして上記のコードだが、このコードは「fragmentをトランザクションとして処理して、一括で処理するため」に行う。
Fragment01 Class
package com.example.myapplication; //AndroidX import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.annotation.NonNull; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; public class Fragment01 extends Fragment { private int cnt = 0; public static Fragment01 newInstance(int count){ // Fragemnt01 インスタンス生成 Fragment01 fragment01 = new Fragment01(); // Bundle にパラメータを設定 Bundle args = new Bundle(); args.putInt("Counter", count); fragment01.setArguments(args); return fragment01; } // FragmentのViewを生成して返す @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment01, container, false); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Bundle args = getArguments(); if(args != null ){ int count = args.getInt("Counter"); String str = "Fragment01: " + String.valueOf(count); cnt = count +1; TextView textView = view.findViewById(R.id.textview_01); textView.setText(str); } Button button01 = view.findViewById(R.id.button_01); button01.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ FragmentManager fragmentManager = getFragmentManager(); if(fragmentManager != null){ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // BackStackを設定 fragmentTransaction.addToBackStack(null); fragmentTransaction.replace(R.id.container, Fragment02.newInstance(cnt)); fragmentTransaction.commit(); } } }); // BackStackで1つ戻す Button pop01 = view.findViewById(R.id.pop_01); pop01.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ FragmentManager fragmentManager = getFragmentManager(); if(fragmentManager != null) { fragmentManager.popBackStack(); } } }); } }
Fragment01クラスでは、newInstance
メソッドで初期化を行う。また、onCreateView
メソッドは、xmlファイルを読み込む際に行う処理であり、onViewCreated
はxmlファイルの読み込み後に行う処理となる。
fragment02.java
package com.example.myapplication; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.annotation.NonNull; public class Fragment02 extends Fragment { private int cnt = 0; public static Fragment02 newInstance(int count){ Fragment02 fragment02 = new Fragment02(); Bundle args = new Bundle(); args.putInt("Counter", count); fragment02.setArguments(args); return fragment02; } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment02, container, false); } public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Bundle args = getArguments(); if(args != null ){ int count = args.getInt("Counter"); String str = "Fragment01: " + String.valueOf(count); cnt = count + 1; TextView textView = view.findViewById(R.id.textview_02); textView.setText(str); } Button button01 = view.findViewById(R.id.button_02); button01.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ FragmentManager fragmentManager = getFragmentManager(); if(fragmentManager != null){ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // BackStackを設定 fragmentTransaction.addToBackStack(null); fragmentTransaction.replace(R.id.container, Fragment01.newInstance(cnt)); fragmentTransaction.commit(); } } }); // BackStackで1つ戻す Button pop01 = view.findViewById(R.id.pop_02); pop01.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ FragmentManager fragmentManager = getFragmentManager(); if(fragmentManager != null) { fragmentManager.popBackStack(); } } }); } }