cssの設計規則BEMのマニュアル

block__element--modifier のように, blockとelementはアンダースコア2つで区切り, elementとmodifierはハイフン2つで区切る. blockが複数単語になる場合は, 単語と単語の間はハイフン1つで区切る. element, modifierが複数単語になる場合も同様である.

これはC言語的なモジュールと言う解釈でOK?

qiita.com

https://seesparkbox.com/foundry/bem_by_example

アセンブリで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

やねうらお産の記事?

bm98.yaneu.com

面白そうな記事があったので、後で見る

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();
                }
            }
        });
    }
}