OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails 日英対応 i18n

# 環境
- rails 5.2
- ruby 2.5

# 方針
- できるだけ手軽に日英対応

# 概要
1. 言語切り替えボタンをヘッダーに設置
2. コントローラー内でセッション変数session[:locale]などにロケール情報を格納
3. before_action で各ページ読み込み前に言語設定
4. ymlファイルへ訳文記入
5. Viewなどで使用

# 実装
### 1. 言語切り替えボタンをヘッダーに設置
簡単に切り替えができるようにヘッダーにボタン設置しました。

```erb:application.html.erb
ヘッダーに以下を設置
<% if session[:locale] == "en" || session[:locale].blank? %>
   <%= link_to "/home/change_language/ja" do %>
    日本語
   <% end %>
<% elsif session[:locale] == "ja" %>
   <%= link_to "/home/change_language/en" do %>
    English
   <% end %>
<% end %>
```
今回は日英のみ対応なので

- session[:locale]に"ja"が入っている場合は「English」
- session[:locale]に"en"が入っている場合は「日本語」

を表示するようにしました。

### 2. コントローラー内でsession変数格納
```ruby:routes.rb
get "/home/change_language/:language" => "home#change_language"
```

```ruby:home_controller.rb
  def change_language
    session[:locale] = params[:language]
    redirect_back(fallback_location: "/")
  end
```

### 3. 各ページ読み込み前にbefore_actionでI18nにlocale設定
before_action に設定することでどのページにアクセスしても先に言語情報が設定されます。
※ユーザーのログイン状態のようなにします

```ruby:application.rb
before_action :set_locale

private
  def set_locale
    if %w(ja en).include?(session[:locale])
      I18n.locale = session[:locale]
    end
  end

```

### 4. app>config>locales> 
- ja.yml
- en.yml

に分けて訳文を記入しました。
例）英語はjaをenに変えるだけです。

```yml:ja.yml
ja:
  #共通で使う言葉
  dictionary:
    words:
      hello: "こんにちは"
  activerecord:
    #Model名
    model:
      user: "ユーザー"
    #カラム名
    attributes:
      user_name: "ユーザーネーム"
      password: "パスワード"
  #viewごとに設定
  users:
    show:
      profile: "プロフィール"
      picture: "写真"
    form:
      required_field: "必須項目"

```

### 5. Viewなどで使用する
```erb:show.html.erb
 <%= t("dictionary.words.hello") %>  => こんにちは
 <%= t("activerecord.attributes.user_name") %>  => ユーザーネーム

# Viewがusers show の場合以下のように省略して記載可能
 <%= t(".profile") %>  => プロフィール
 <%= t(".picture") %>  => 写真

# カラム名を設定しておけばフォームヘルパーでも言語により自動で切り替え
<%= form_with scope: @user ,,,,,%>
<%= form.label :user_name %> =>ユーザーネーム
<% end %>
```

```erb:_form.html.erb
# パーシャルはアンダーバーを省き利用Viewがusers　_form.html.erbの場合
 <%= t(".required_field") %>  => 必須項目

#　このパーシャルがusers show.html.erbで利用されていたとしても
 <%= t(".picture") %>  => ×　これは利用できません。
【Rails】request specでsigned/encrypted cookiesにアクセスする

# 環境

- Rails 5.2.3
- RSpec 3.9.0 

# 問題/やりたいこと

そのままでは request spec 内で signed cookie 及び encrypted cookie にアクセス出来ません。
具合的には、以下のようなエラーが出ます。

```ruby
     NoMethodError:
       undefined method `signed' for #<Rack::Test::CookieJar:0x00007fbc6751fa38>
```

これは、request spec 内で使われている cookies オブジェクトが `ActionDispatch::Cookies::CookieJar` ではなく `Rack::Test::CookieJar` のインスタンスであり、`signed` や `encrypted` メソッドを実装していないためです。


# 解決方法

`ActionDispatch::Cookies::CookieJar` を使います。

```ruby
it do
  get some_url
  expect(response).to have_http_status(:success)

  jar = ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash) # ここ
  expect(jar.signed['foo']).to eq('something') # signed cookie も
  expect(jar.encrypted['bar']).to eq('something_else') # encrypted cookie も読み取れるようになる
end
```

# 補足

ただこれだけでは、`secure: true`（httpsサーバにだけcookieを送信する設定）の場合には動きません。（`jar.signed['foo']`の部分が `nil` になってしまいます）

```ruby
    cookies.signed[:foo] = {
      value: 'your_value_comers_here',
      expires: 1.day.from_now,
      secure: true,  # この設定
      httponly: true
    }
```

その場合、`development` 及び `test` 環境では、 `secure: true` を使わないようにしましょう。

```ruby
    def method_that_uses_cookie
      foo = 'foo'
      cookies.encrypted[:foo] = build_cookies(foo)
    end

    def build_cookies(value)
      cookie = {
        value: value,
        expires: 1.day.from_now,
        httponly: true
      }

      if Rails.env.development? || Rails.env.test?
        cookie
      else
        cookie.merge(secure: true)
      end
    end
```

# 補足2

↑の補足の代替案として、rspec を ssl モードで動かす方法も試しました。
https://stackoverflow.com/questions/6785261/test-an-https-ssl-request-in-rspec-rails に書かれているように `protocol: 'https://'` や `protocol: :https'` を試しましたが、駄目でした。
`ArgumentError: unknown keyword: protocol` と言われるので、そもそも `protocol` が rspec でサポートされていないようです。

# 元ネタ

こちらの記事を参考にさせてもらいました。
https://philna.sh/blog/2020/01/15/test-signed-cookies-in-rails/
51歳（現52）からのプログラミング　備忘Code

var_dump(false==null);
var_dump(false===null);

#ファイル読み書き
```:access.log
aaa	bbb
aaa	bbb
aaa	bbb
```

```php:書き込みcode
$ary[]='aaa';
$ary[]='bbb';

$file=fopen('access.log','ab');
flock($file,LOCK_EX);
fwrite($file,implode("\t",$ary)."\n"); //\nは必須と覚える
flock($file,LOCK_UN);
fclose($file);
```
```php:読み出しcode

<?php
function fopn(){
  $file=fopen('access.log','rb');
  flock($file,LOCK_EX);
  return $file;
}

function fcls($file){
  flock($file,LOCK_UN);
  fclose($file);
}

// --------------------------------------
<?php
function fopn(){
  $file=fopen('access.log','rb');
  flock($file,LOCK_EX);
  return $file;
}

function fcls($file){
  flock($file,LOCK_UN);
  fclose($file);
}

//-----------------------------
function fgcsv(){
  $file=fopn();
  print_r(fgetcsv($file));
  fcls($file);
}

function fg(){
  $file=fopn();
  print_r(fgets($file));
  fcls($file);
}

function f(){
  print_r(file('access.log'));
}

function fgc(){
  print_r(file_get_contents('access.log'));
}

function rf(){
  readfile('access.log');
}

fgcsv();echo '<br>';
fg()   ;echo '<br>';
f()    ;echo '<br>';
fgc()  ;echo '<br>';

// Array ( [0] => aaa bbb )
// aaa bbb
// Array ( [0] => aaa bbb [1] => aaa bbb [2] => aaa bbb )
// aaa bbb aaa bbb aaa bbb
```
Vue.jsのv-forの見落としがちなkey属性

##はじめに
Vue.jsのv-for正しい使い方で実装できていますか。
細かい話ですがつい先日Vue.jsのv-for実装する時、他のソースコード見てみるとkey属性が指定されていませんでした。
後ほど説明しますが例外を除いてはkey属性を指定することが奨励されています。
（バージョン2.2.0以降の話なのでそれ以前のもので実装されている方は軽い気持ちでで読んでください。）

Vue.jsのv-forのkey属性については公式ドキュメントにも以下のように書いてあります。
>繰り返される DOM の内容が単純な場合や、性能向上のために標準の動作に意図的に頼る場合を除いて、可能なときはいつでもv-forにkey属性を与えることが推奨されます。

引用：[リストレンダリング — Vue.js](https://jp.vuejs.org/v2/guide/list.html#v-for-%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AB%E8%A6%81%E7%B4%A0%E3%82%92%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)

##なぜkey属性を指定することが奨励されているのか

>これはいかなるデータもコンポーネントへ自動的に渡すことはありません。なぜなら、コンポーネントはコンポーネント自身の隔離されたスコープを持っているからです。反復してデータをコンポーネントに渡すためには、プロパティを使うべきです。

引用：[リストレンダリング — Vue.js](https://jp.vuejs.org/v2/guide/list.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8-v-for)

公式ドキュメントにはこう書いてありますと言ってしまえばその限りなのですが、keyを指定するとVue.jsが各要素を効率よく追跡できるようになりパフォーマンス向上するからです。

##key属性を指定したソースコード
```
<ul id="example-1">
  <li v-for="item in items" :key="item.message">
    {{ item.message }}
  </li>
</ul>
```
引用：[v-for で配列に要素をマッピングする](https://jp.vuejs.org/v2/guide/list.html#v-for-%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AB%E8%A6%81%E7%B4%A0%E3%82%92%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)

##【注意】v-forにkeyを指定してはいけないパターン
Vue.jsのv-forのkey属性を推していましたが指定してはいけないパターンがあります。
keyに指定するのは一意の値である必要があり、これが一意の値にならない場合はkey属性を指定してはいけません。
正しく動作しないなどのエラーになるのでお気をつけください。

##最後に
いかがでしたでしょうか。
なんとなくや前のソースコード参考にという形で実装していると思わぬ落とし穴もあるので、常に疑いながら実装することは大事かもしれませんね。
Djangoのforms.pyでログインユーザーを取得する方法

# やりたいこと

forms.pyのFormClassの中で、現在ログインしているユーザー情報を使用して
何らかの処理を行いたい。

```python:forms.py

class Form(forms.ModelForm):
    def method(self):
        model = Model
        model.objects.filter(user=[ログインしているユーザー]) # ログインユーザーを使いたい
```

# 解決策

views.pyでFormインスタンスを作成する際、引数としてログインしているユーザー情報を渡す。

```python:views.py

class View(View):
...
    form = Form(user=request.user, data=request.POST)
...
```

```python:forms.py
...
class Form(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        self.current_user = user
        super().__init__(*args, **kwargs)

    def method(self):
        model = Model
        model.objects.filter(user=self.current_user)
...
```

# 使用するとき

formでバリデーションをするときに使用した。

# 参考

stackoverflowの質問
https://stackoverflow.com/questions/5119994/get-current-user-in-django-form

参考にした回答
https://stackoverflow.com/a/5122029

質問者
https://stackoverflow.com/users/616173/yulia

回答者
https://stackoverflow.com/users/616173/yulia

回答者
[Lubuntu20.04]AutoKeyを使って変換/無変換キーを活用するまでのメモ

## 動機
ふだんWindowsでAutoHotkeyを使っているので似たような事をLubuntuでもやりたい。

## 下準備
### AutoKeyのインストール
システムツール > Discover > autokeyを検索 > AutoKey(Qt)をインストール

## xkbの設定
### Hyper/Metaキーの割り当て
Autokeyでは直接「変換」「無変換」キーを扱えないので代わりにそれぞれ「Hyper」「Meta」キーを割り当てます。

```
sudo vim /usr/share/X11/xkb/symbols/inet
```

```
key <HENK>   {      [ Henkan                ]       };
key <MUHE>   {      [ Muhenkan              ]       };
```

↑を↓に変更して保存。


```
key <HENK>   {      [ Hyper_L               ]       };
key <MUHE>   {      [ Meta_L                ]       };
```

## AutoKeyの設定
インストールしたAutoKeyを起動します。
「my_autokey」など適当な名前でフォルダを作成し、使用したいキーのスクリプトを作成していきます。

```:left
keyboard.send_key("<left>")
```

```:down
keyboard.send_key("<down>")
```

```:up
keyboard.send_key("<up>")
```

```:right
keyboard.send_key("<right>")
```

上記のleft/down/up/rightのHotkeyを[Meta]+h/j/k/lに設定します。

## 結果

とりあえず[無変換]+h/j/k/lキーで、left/down/up/right動作を実現できました。

この調子でホームポジションから遠いhome/end/delete/BSも設定しよう(決意)。

[変換]キーを何に使うかはまだ決めていませんがWindowsではCtrlに割り当てていたので、Ctrlがいいかなあ(未定)。

## 課題

metaキー単独押下時の動作が邪魔になる事があるけど、metaキー単独の動作を無効化する方法がよくわかりません。
【Git,Github】業務フロー(開発フロー)

# 記事にした経緯
以前、とあるIT企業で開発のアルバイトをしていました。
当時はgitやgithubの基本的な操作は知っていたのですが、
**「結局、業務の中でどんな風に使えばいいの？」**となっていました。
そこで、「gitやgithubの業務（開発）フローの記事があったら、役に立つ人いるんじゃね？?」思い、記事を執筆しました。

# 対象
- gitの基礎はわかる人

# gitを使った開発フロー
1. 自分の作業場所を最新状態にする
2. ブランチ名を作成,作成したブランチに移動する
3. ソースコードの修正、追加などを行う
4. 修正、追加したソースコードをステージングに追加する
5. ステージングに追加したファイルをローカルリポジトリに追加する
6. Githubのリモートブランチを更新する
7. GithubでPR（pull request）作成する
8. レビューをもらう
9. 3へ
10. 全て修正すれば、マージしてもらう(する)
11. マージし終わったら、作成したブランチを削除する


## 1. 自分の作業場所を最新状態にする  
まずは、自分自身の作業場所を最新状態にします。

最新状態する方法は主に以下の三つです。  

```console
$ git pull 
```
or

```
$ git fetch & git rebase origin リモートブランチ名
```
or

```
$ git fetch & git merge origin リモートブランチ名
```
個人的には二番目の`git fetch & git rebase origin リモートブランチ名`を使っています。


## 2. ブランチ名を作成,作成したブランチに移動する
自分の作業をするためにブランチを作成し（切って）、作成したブランチに移動します。
ブランチの作り方は主に二通りあります。

```console
$ git branch ブランチ名 & git checkout ブランチ名
```

or

```
$ git branch -b ブランチ名
```

- `-b`: ブランチを作成し、チェックアウトする  
会社によってブランチ名の命名規則にはルールがあると思いますが、  
基本的にはgitflowにしたがった命名規則でブランチ名をつけていました。
  


> 参照
> https://nvie.com/posts/a-successful-git-branching-model/

## 3. ソースコードの修正、追加などを行う
機能追加や修正するためにソースコードを追加、修正を行います。

## 4. 修正、追加したソースコードをステージングに追加する
3.で修正や追加したソースコードをgithubに反映させるために、まずはステージングにあげてやる必要があります。
コードをステージングに追加するためにはaddコマンドを使用します。

```console
$ git add 修正したソースコード1, 修正したソースコード2, ・・・
```

自分自身はgitコマンドを打つことは少なく、[tig](https://jonas.github.io/tig/)を使ってやっていました。
## 5. ステージングに追加したファイルをローカルリポジトリに追加する
次にステージングにあげたソースコードをローカルリポジトリに追加します。
コマンドは以下の通りです。

```console
$ git commit -m "コミットメッセージ"
```
コミットメッセージは何をしたのかがわかるようにしっかりと書きましょう。
commitについてもaddコマンドと同様にtigを使用していました。

### コミットメッセージを間違えた場合など
コミットメッセージを間違えたり、ソースコードをローカルリポジトリに上げ忘れたりする時があると思います。
そういったときは以下のコマンドでコミットを取り消すことができます。  

```
git commit --amend
```
## 6. Githubのリモートブランチに更新する
修正したソースコードをローカルリポジトリに上げ終わったら、次はgithubのリモートリポジトリにその内容を反映してやる必要があります。 
その場合はpushコマンドを使用します。

```console
$ git push origin ブランチ名
```

## 7. GithubでPR（Pull Request）作成する
pushし終わったら、修正したソースコードをレビュアーの方々に見てもらうためにプルリクエストを作成します。
プルリクエストの作成方法は以下を参考にしてください。
[プルリクエストの作成方法](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)

## 8. レビューをもらう
プルリクエストを出すと、レビュアの人が自分が修正したコードに対して、コメントや修正依頼が入ります。

## 9. 3へ
修正依頼をもらった場合は、またソースコードの修正を行います。

## 10. 全て修正すれば、マージしてもらう(する)
修正依頼が全て終われば、レビュアーの方が出したプルリクエストを承認(approve)してくれます。
レビュアー全員の承認が降りれば、そのプルリクエストがdevelopブランチにマージされます。
（レビュアーの方か自分自身でマージを行います。）

> developブランチ
>  -  次のリリースのための最新の開発作業の変更が反映されているブランチ

## 11. マージし終わったら、作成したブランチを削除する
マージされたら、作業していたブランチを削除して、作業は終了です。
他のブランチ(developブランチなど)に移動して、以下のコマンドで作成したブランチを削除します。

```
$ git branch -d ブランチ名
```
# まとめ
gitの開発の流れ

1. 自分の作業場所を最新状態にする
2. ブランチ名を作成,作成したブランチに移動する
3. ソースコードの修正、追加などを行う
4. 修正、追加したソースコードをステージングに追加する
5. ステージングに追加したファイルをローカルリポジトリに追加する
6. Githubのリモートブランチを更新する
7. GithubでPR（pull request）作成する
8. レビューをもらう
9. 3へ
10. 全て修正すれば、マージしてもらう(する)
11. マージし終わったら、作成したブランチを削除する


# さいごに
今回は、git,githubの開発の流れについて書きました。
何かわからないことなどありましたらコメントよろしくお願いいたします。
2020-05-30 PYNQ-Z1 > base.bitを使ってPMODA[4]の電圧を立てる

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### 概要

- base.bitを使う
- pynq.libを使ってPMODAを制御
- PMODA[4]の電圧を立てる

### 参考

- https://www.slideshare.net/ryos36/pynq-pmod
    - p36
    - 情報感謝です
    - ただし、実装が古いので、こちらで変更しました
        - pynq.iopはなく、pynq.lib.pmodへ変更
    - [2020-05-30 PYNQ-Z1 > PMODA > pynq.lib.pmodからimportする (pynq.iopは古い) > pynq.lib.pmodを使う](https://qiita.com/7of9/items/8a70302265180ba1619f)

### コード

Jupyter Notebook接続して下記を実行する。

```py
from pynq import Overlay
from pynq.lib.pmod import PMODA
from time import sleep

ol = Overlay("base.bit")
ol.download()
ol.ip_dict
```

```
{'audio_direct_0': {'addr_range': 65536,
  'driver': pynq.lib.audio.AudioDirect,
  'fullpath': 'audio_direct_0',
...
(後略)
```

```py
from pynq.lib import Pmod_IO
pmod_KYPD_COL = [Pmod_IO(PMODA, index, 'out') for index in [0, 1, 2, 3, 4, 5, 6, 7]]
pmod_KYPD_COL[4].write(1)
```

デジボル接続して、PMODA[4]が3.3V立つことを確認した。
Raspberry Pi 4のオススメ設定


新社会人になり一人暮らしを始めて早一年、IoTに目覚めてしまいました。
既にあるGoogle Nest hubから「声でPCに電源を入れたい」を原動力に、まずはRaspberry Pi 4(4GB)を購入しました。

生きてきた証として記録しておきます。

# 事前準備
raspberry piのマニュアルに書いてある程度の初期設定を終えて、GUI画面で操作できるようになってWi-Fi接続したあたりから。


## オススメ1：SSH接続


Raspberry Piとディスプレイを繋いでそのままサーバー設定・プログラミングするのも良いですが、他PCがある方はRaspberry Pi本体を置き物にして、他PCからSSH接続することをオススメします。
なんてったって場所を選ばず作業できます。




別のPCにteraterm※1をインストール、設定はここ※2を参考にしました。
以下の画面までいければおｋ(raspberry piのIPアドレスはifconfigで確認・メモを取った前提)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585369/bd98d0b4-be6b-6485-8eb9-3bbbbf34820f.png)
※1　https://forest.watch.impress.co.jp/library/software/utf8teraterm/
※2　https://eng-entrance.com/teraterm-install

ユーザ名・パスを入力してログイン。
(デフォルトユーザ名：pi　パス：raspberry)

ちなみに
root@raspberrypi:~# passwd
で現在ログインしてるユーザのパスワードを変更することができます。

##オススメ2：viの挙動直し
デフォルトのままではviの挙動がまるでおかしくてブチギレでした。

・バックスペースが反映されない
・矢印キーがABCDに変換される
ので、先にこちらを行っておくことをお勧めします。
http://marupeke296.com/IKDADV_PI_ABCDProb.html



##オススメ3：温度確認
長く使ってるとCPUの温度が気になりだしてきます。(気にならない？自分だけ？)
cat /sys/class/thermal/thermal_zone0/temp
→46251(1000倍の値で出力されるので約46度)


##Apacheインストール・phpインストール
httpサーバは特にこだわりもないので会社でも使ってるApacheをインストールしました。

・Apacheインストール
root@raspberrypi:~# apt-get install apache2

・ステータス確認
root@raspberrypi:~# service apache2 status
→「Active: active (running)」ってなってれば動いてる状態。[Q]キーで戻る。
(自分の場合　http://192.168.0.15 にApache2 Debian Default Pageが見れる。/var/www/html/以下にhtmlやphpファイルを作って表示されることを確認)


・phpインストール
root@raspberrypi:/var/www/html# apt-get update
root@raspberrypi:/var/www/html# apt-get install php

・phpバージョン確認
root@raspberrypi:~# php -v




環境整ったので次回はWOLでPCつけたり温度センサで室温測定したりするつもりです。
【React】 useStateで配列を保存するときの注意点


`useState`で配列を保存する時は、
新しい配列を生成して保存しないと再描画されません。

## サンプルコード
×： 再描画されない

```
const [value, setValue] = React.useState(null)

value.push(props.newValue)

setValue(value) 
```

○： 再描画される

```
const [value, setValue] = React.useState(null)

setValue([...value, props.newValue])
```

## 理由
Reactでは`state`の値が変化した時にコンポーネントが再描画されます。

stateの値の変化を、`Object.is()` で判定しているとのことです。なので、`push`や`splice`では前回と同じ値と判定されるそうです。

そのため、再描画が起きないので、`[...array, props.newValue]`　などで値をコピーした新しい配列を生成して`state`に保存すると再描画されます。

## 参考

- https://gotohayato.com/content/509/
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/is
- http://jsstudy.hatenablog.com/entry/Convert-to-JSON-when-comparing-arrays-and-objects-in-JavaScript

## おまけ
新しい配列を生成する以外にも、immutable.jsというのを使っても解決できるそうです。

- https://immutable-js.github.io/immutable-js/

2023/3/10: 追記、上記の内容は オブジェクトでも同様です。
RailsでJavascriptを使う

Rails5.1以降では、webpackがJSの管理パッケージとして導入されており、以前で使われていたsprocketsはデフォルトでは装備されなくなっています。
ApplicationHtmlをみてみると、application_pack_includeなんちゃらみたいなコードがありますが、これがファイルにあるjsのコードを全て読み込んでapplication.jsに送っています。
sprocketsの場合だと、application_something_includeなんちゃらだったと思います。
ゼロから始めるLeetCode Day41「394. Decode String」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day40「114. Flatten Binary Tree to Linked List」](https://qiita.com/KueharX/items/3f0af8806a720999bf45)

今はTop 100 Liked QuestionsのMediumを解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。

# 問題
[394. Decode String](https://leetcode.com/problems/decode-string/)

問題としては、エンコードされた文字列を指定すると、そのデコードされた文字列を返すようなアルゴリズムを設計しましょう、というものです。

エンコーディングルールは、k[encoded_string]です。角かっこ内のencoding_stringは、正確にk回繰り返されます。 kは正の整数であることが保証されていることに注意してください。

入力文字列は常に有効であると想定できます。余分な空白はなく、角括弧は整形式などです。

さらに、元のデータに数字が含まれておらず、数字はこれらの繰り返し番号kのみに対応していると想定することもできます。たとえば、3aや2[4]のような入力はありません。

例としては以下の通りです。

`
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
`

# 解法

```Python
class Solution:
    def decodeString(self, s: str) -> str:
        stack,curNum,curStr = [],0,''
        for st in s:
            if st == "[":
                stack.append(curStr)
                stack.append(curNum)
                curStr = ""
                curNum = 0
            elif st == "]":
                num = stack.pop()
                preStr = stack.pop()
                curStr = preStr + num*curStr
            elif st.isdigit():
                curNum = curNum*10 + int(st)
            else:
                curStr += st
        return curStr
# Runtime: 20 ms, faster than 98.29% of Python3 online submissions for Decode String.
# Memory Usage: 13.9 MB, less than 5.77% of Python3 online submissions for Decode String.                
```
stackを用いて解きました。
for文で最初から要素を舐めていき、与えられた要素によって処理を変えました。
たまたまとはいえ速いですね・・・

良い感じなので今回はここまで！お疲れ様でした。
2020-05-30 PYNQ-Z1 > PMODA > pynq.lib.pmodからimportする (pynq.iopは古い) > pynq.lib.pmodを使う

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### PMODAのimport (過去情報)

PMODAをimportする例として下記のような実装がみられる。

```py
from pynq.iop import PMODA
```

これは古い。

### pynq.iopは古い

- ModuleNotFoundError: No module named ‘pynq.iop’ in PYNQ Z2
    - https://discuss.pynq.io/t/modulenotfounderror-no-module-named-pynq-iop-in-pynq-z2/1000

上記においてpynq.iopが古いことが記載されている。
pynq.libを代わりに使うとのこと。


### pynq.lib.pmodを使う (2020年5月現在)

代わりにこうする。

```py
from pynq.lib.pmod import PMODA
```
link_toメソッドの使い方

link_toメソッドはerbに埋め込みます。
アセットパイプラインにより、erbファイルをhtmlに変換する事でlink_toからaタグに変わります。
このように、Rubyのコードを自動で変換する機能がついているのがRuby on Railsです。
えへへ
Firestoreを使った雑感

# 概要

去年度からFirestoreを使用した際の個人的な雑感を示します。


# 構造の説明

　Firestoreには「collection」「documnet」「field」という括りがあります。　　

　「collection」には一つ以上の「document」が必要となります。「document」にはユニークIDが設定でき（自動生成も可能）、および様々なデータ型の「field」を設定できます。また、「dpcument」には「サブcollection」を設定できます（以下の構造を参照）。「fierd」は言ってしまえばmap（pythonであればdictionary）と同義と考えていいです。

```
collection-main
 |-<document-1>
 |   |-field-key：field-value
 |   |-field-key：field-value
 |   `-collection-sub
 |      `-<document-1.1>
 `-<document-2>
```

# DBの設計

　基本的には「collection」をRDBのテーブルと同義と考えて良いと考えています。「サブcollection」には、「document」に紐づく情報を強く紐づけることが出来ます。個人的には、親になる「document」を削除する際、と一緒に削除したい情報については「サブcollection」として登録すると良いと思います。

　例えば、ブログ用のDBを対象とし、基本的なテーブルとして「ユーザ」「記事」二つがあるとします（もっと必要なテーブルがあると思いますが、今回は簡略化します）。自分であれば以下のようにします。

```
ユーザ(collection)
 |-ユーザ１(document)
 |   |-名前：<value>
 |   |-Emailアドレス：<value>
 |   `-記事(collection)
 |      `-記事１(document)
 |          |-タイトル：<value>
 |          `-内容：<value>
 `-ユーザ2(document)
    ・（ユーザ1と同様に続く）
    ・
    ・
```

　基本的に結びつきが強いものについては、何も考えずに「サブcollection」で良いと思います。ユーザが共有するような情報は「ユーザcollection」とは違う「collection」を用意すればよいと思いました。

# ちょっと困ったこと

　documentを削除する際、それにぶら下がるサブコレクションの内容は削除されない点は少し面倒に思いました（この場合、ユーザの「field」は削除されるけど、記事は削除されない）。fieldの内容を増やしたい際は、構造を整形する際にはそれ用にスクリプトを作成しないといけないのかなと思いました（これはあまり気にしなくてもいいかもしれませんが）。あとは、バックアップはCloud storageに入れるにしてもそれ用にスクリプトを作成しないといけないと思いました。
図解:Docker全体像(状態遷移、コマンド)

# はじめに
初めてDockerを触ってみて、ややこしいと感じた、

- 状態遷移
- イメージとコンテナ
- アタッチとデタッチ
- これらに紐づくコマンド

を1枚の図にまとめてみました。

# Docker全体像
![DockerStateDiagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643108/a70dd683-bdc3-1274-548e-6571e5a450c5.jpeg)

# 参考
[Lifecycle of Docker Container](https://medium.com/@BeNitinAgarwal/lifecycle-of-docker-container-d2da9f85959)
[Dockerイメージの理解とコンテナのライフサイクル](https://www.slideshare.net/zembutsu/docker-images-containers-and-lifecycle)
Defcon DFIR CTF 2018 HR Server - Saved 2

#問題

https://defcon2018.ctfd.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cbd7ade2-f171-b808-cb2f-ace7c5395f47.png)

mpowersによって保存されたバッチファイルの名前は何ですか？

[答えはc：*****で始まるフルパスです]

#解いてみた

mpowersって何？

ユーザフォルダの中を見るとmpowersがいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c90b81e8-bb1a-3fc9-a40f-da8ad5b85b6a.png)

この人が保存したバッチファイルを探すということらしいです。

batファイルをかたっぱしから探してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c2e667e5-36a1-0a31-46fd-306b585f30e9.png)

一番上に手作り感があるbatファイルがあったのでこれが答えです、
iosのショートカットで現在時刻の年月日時分を別々の変数に入れる

**この記事を書いたあと、同じ処理を実現するとてもスマートな方法をコメントで教えていただきました。あまりにスマートすぎて記事が短くなったのでtipsの中にまとめました。[iosのショートカット tips](https://qiita.com/osadataku/items/0578fb8c67b635dad598) ナイスなコメントをしてくださった @Kynako さん、ありがとうございました。

---

iosに搭載されているショートカットは魅力的なプログラミング環境なんだけど、情報が少ないので、見つけたtipsを記録しておく

#現在時刻の文字列
現在時刻を取得して年月日時分を別々に得るまで
##取得
下の図のアクションで現在時刻を取得して、それを文字列テキストに変換します
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/9bc8fa39-29c7-1ef8-a41b-d651e8b91e74.jpeg)
以下の説明では、最初のアクションを

[日時/{現在の日付}]　(1)

次のアクションを

[書類/{日時}からテキストを取得]　(2)

と表記します。{}は変数を示します
日時はアクション(2)で「日付として」、日付けフォーマット「中」、時間フォーマット「短」としたとき
2020/05/28 22:47　(a)
あるいは
2020/05/28 5:24　(b)
というフォーマットになります
##年月日の取り出し
正規表現を使って日時文字列から年月日を取り出します

[テキスト/{テキスト}で{[0-9][0-9]}に一致]　(3)

日時文字列から数字2文字の組を1要素とするリストを作ります
(a)の例では
20
20
05
28
22
47
(b)の例では
20
20
05
28
24
のリストになります。(b)の例では「時」の要素が1文字なので選ばれません
###年の抽出
リストの第1，2要素を取り出します

[スクリプティング/{一致}から{Rangeの項目}の{1}から{2}までを取得]　(4)

出力は
20
20
となります
###月の抽出
リストの第3要素を取り出します

[スクリプティング/{一致}から{項目のインデックス}の{3}を取得]　(5)

出力は
05
となります
###日の抽出
リストの第4要素を取り出します

[スクリプティング/{一致}から{項目のインデックス}の{4}を取得]　(6)

出力は
28
となります

##時分の取り出し
正規表現を使って日時文字列から時刻を取り出します

[テキスト/{テキスト}で{[ 1][0-9]:[0-9][0-9]}に一致]　(7)

日時文字列からスペースか「１」で始まり「:」で時分を分けた要素を取り出します
(a)の例では
22:47
(b)の例では
 5:24
となります
(b)の場合は0パディングしたいので先頭のスペースを「0」に変換します

[書類/{一致}の{ ([0-9]):を{0$1:}に置き換え}]　(8)

アクション(8)で()で囲まれている正規表現で一致した文字列を「$1」で参照します
出力は(a)の場合は変化なし（マッチしない）、(b)の場合だけ
05:24
となります
次に、「:」で分割してリストを作ります
[テキスト/{アップデートされたテキスト}を{カスタム}{:}で分割]
###時の抽出
リストの第1要素を取り出します

[スクリプティング/{テキストの分割}から{項目のインデックス}の{1}を取得]　(9)

出力は(a)の場合は
22
となります
###分の抽出
リストの第2要素を取り出します
[スクリプティング/{テキストの分割}から{項目のインデックス}の{2}を取得]　(10)
出力は(a)の場合は
47
となります

これで

| アイテム | アクション |
|:-:|:-:|
| 年 | 4 |
| 月 | 5 |
| 日 | 6 |
| 時 | 9 |
| 分 | 10 |
年月日時分が別々の出力として得られました

#現在時刻の利用
Defcon DFIR CTF 2018 HR Server - SMB 2

#問題

https://defcon2018.ctfd.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/34a9ad0b-7c8f-9153-a37d-37fe7bea5e34.png)



2018-08-08 18：10：38.554（UTC）で、匿名ログオンを介してSMBにアクセスしようとしたクライアントのIPアドレスは何でしたか？

#解いてみた

SMBのログイン履歴を見てみましょう。

```
D:\[root]\Windows\System32\winevt\Logs\Microsoft-Windows-SMBServer%4Security.evtx
```

2018-08-08 18：10：38.554（UTC）を日本時間に直すと9時間プラスなので
2018-08-09 03：10：38.554（JST）です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f2262ed2-7fa5-ea4f-c2c0-c238f8509bed.png)

ありました。
NUC10i7FNH

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/ffe03291-a26a-f2c2-6d2e-9be18d61c8d8.png" width=80%>

## 【前文】
VirtualBox で遊ぶ目的で購入。初NUC。
構成は以下。

| NUC | メモリ | ストレージ |
| ---- | ---- | ---- |
| NUC10i7FNH | Crucial 32GB Kit (2 x 16GB) DDR4-2666 SODIMM CT2K16G48FD8266 | Western Digital WD Black 内蔵SSD M.2-2280　WDS250G3X0C-EC |

## 【CINEBENCH】
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/e9db0bdb-cc6c-6e05-8854-3fac65355edc.png" width=80%>
デスクトップCPUなら第7世代Corei7と同等か。

## 【CrystalDiskMark】
実は初M.2 だったりするので一応計測。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/dba6613e-0a35-aeb9-5d8f-fcb83843fb3e.png" width=80%>

## 【雑感】
少々割高なのが難点だけど、良いおもちゃだと思う。

###### 2020/06/07 追記
予想はしていたけどやはりストレージ容量が足りないので 1TB SSD を追加（WD BLUE）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/edb9955d-2b4a-5b51-2840-7d71433788dd.png" width=80%>
【Ruby】メソッドの定義まとめ


#【Ruby】メソッドの定義まとめ

rubyのメソッド定義に関する記述のまとめ。

メソッドの定義方法は基本的にpythonと類似。
Rubyは1行目文末に「:」不要。終わりに「end」が必要。

「:」を使ったキーワード引数で、引数名で値を渡すことができる。

**目次**

1. [メソッド定義](#メソッド定義)
2. [メソッドの呼び出し](#メソッドの呼び出し)
3. [引数を渡す](#引数を渡す)
4. [戻り値](#戻り値)
    1. [メソッドで戻り値を使う](#メソッドで戻り値を使う)
    2. [戻り値で真偽値を返す](#戻り値で真偽値を返す)
    3. [returnでメソッドが終了する](#returnでメソッドが終了する)
    4. [戻り値とif文（戻り値をif文に渡す）](#戻り値とif文戻り値をif文に渡す)
    5. [戻り値とif文メソッド内でreturnとif文を使う](#戻り値とif文メソッド内でreturnとif文を使う)
5. [キーワード引数](#キーワード引数)


##メソッド定義

```ruby:
def メソッド名
 処理
end
```

 └ end必須

###メソッドの呼び出し
`メソッド名`
　└ ( )不要 ※引数なしの場合

```ruby:メソッド実例
def hello
 puts "こんにちは"
end

hello

#出力
こんにちは
```

###引数を渡す

```ruby:
def メソッド名(引数名1,引数名2,,)
 処理
end

メソッド名(引数名1,引数名2,,)
```
　└ 引数なしでは呼び出せない（ないとエラー）　　
　└ 引数の数は合わせること（合わないとエラー）
　└ 引数名が使えるのは定義したメソッドの中のみ（スコープ）


##戻り値
`return　値`
　└ 値をメソッドと置き換える。
　└ 値は文字列、数式など


###メソッドで戻り値を使う

```ruby:
def メソッド名
 return 値
end
```

```ruby:戻り値の例
def divide(a,b)
  return a/b
end

puts add(10,5)

value=add(10,5)
puts "割り算結果は#{value}です"

#出力
2
割り算結果は2です
```


###戻り値で真偽値を返す
`return 条件式`
　└ 条件式の結果がtrue/falseで返される

`メソッド名?(引数名)`
　└ 真偽値(true/false)を返すメソッドには「?」をつける
　└ 慣習として

```ruby:0以上かを真偽値で返すメソッド
def positive?(value)
 return value > 0
end

puts positive?(10)
puts positive?(-3)

#出力
true
false
```


###returnでメソッドが終了する
メソッド内のreturn以降の処理は実行されない。

```ruby:
def divide(a,b)
  return a/b
  puts "割り算しました"
end

divide(10,5)

#出力
2
```

※returnのすぐ下の「puts "割り算しました"」は実行されない。



###戻り値とif文（戻り値をif文に渡す）

メソッドの戻り値に真偽値を設定し、if文の条件式でメソッドを呼び出す。

```ruby:
#真偽値を返すメソッド
def discount?(price)
 return price >= 1000
end


price=800

if discount?(price)
  puts "10%値引きします。価格は#{price*0.9}です。"
else 
  puts "あと#{1000-price}円で10%割引です"
end


#出力
あと200円で10%割引です
```


###戻り値とif文（メソッド内でreturnとif文を使う）
メソッドの中でif文と戻り値を使う。

```ruby:
#1000以上で消費税を割り引く
def total_value(price)
 if price >= 1000
   return price
 end 
 return 1000*1.1

end

puts "お支払い金額は#{total_value(800)}円です"

#出力
お支払い金額は880円です
```


###キーワード引数
引数の名前で値を指定する。
`def メソッド名(引数名A:,引数名B:,,,)`
　└ 引数名の後ろに「:」をつける
　└ 処理は変更なし

`メソッド名(引数名B:値,引数名A:値,,,)`
　└ メソッド内で定義した引数名と合わせる
　└ 引数名の後に「:」をつける


```ruby:
def user(name:, age:, gender:, word:)
  puts "#{name}さんの年齢は#{age}です"
  puts "性別は#{gender}です"
  puts "口癖は「#{word}」です"
end

user(gender:"male", name:"JoJo", age:"17", word:"オラオラオラオラオラオラ")

#出力
JoJoさんの年齢は17です"
性別はmaleです"
口癖は「オラオラオラオラオラオラ」です"
```

<br>
uPD8279を使ってみた（keyboard編)

EX-80のバスに以前日米商事で108円で入手したuPD8279つないでみました。

![写真（2020-05-29 16.49）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/52cbe798-60c9-4c74-fac7-e2c1ea843d8b.jpeg)

このユニバーサル基板は亜土電子で買ったものだった気がします。古くなってハンダのノリ悪いです。

8279はIntelのi8279がオリジナルで、セカンドソースがいろいろな会社から発売されていました。

Z80で使われている方がいて大変参考になりました。

https://yoshikiyo.com/2019/10/17/20191017-5/

CSにはA4を直接つなぎました。

デコーダーはストックの74LS138(HCじゃなく)を使いました。EX-80の頃はLSが標準品でした。

テストプログラムです。

```
;

TVCLR   EQU     036CH
TVDSP   EQU     02DEH

; 8279 ports

DAT     EQU     0EEH
CTL     EQU     0EFH

        ORG     8200H

        CALL    TVCLR
        MVI     A, 00H
        OUT     CTL
        MVI     A, 38H
        OUT     CTL
        MVI     A, 50H
        OUT     CTL

        IN      CTL
        STA     LAST
        CALL    DEBUG
        MVI     B, 08H
        CALL    PAD

LOOP
        LDA     LAST
        MOV     B, A
        IN      CTL
        CMP     B
        JZ      LOOP
        STA     LAST
        CALL    DEBUG
        LDA     LAST
        MVI     B, 07H
        ANA     B
        MVI     B, 00H
        CMP     B
        JNZ     DATIN
        MVI     B, 08H
        CALL    PAD
        JMP     LOOP

DATIN
        IN      DAT
        CALL    DEBUG
        MVI     B, 06H
        CALL    PAD
        JMP     LOOP

PAD
        PUSH    B
        MVI     A, 20H
        CALL    TVDSP
        POP     B
        DCR     B
        JNZ     PAD
        RET

DEBUG
        STA     VAL
        RRC
        RRC
        RRC
        RRC
        CALL    WRITE
        LDA     VAL
        CALL    WRITE
        RET

WRITE
        MOV     C, A
        MVI     B, 0FH
        ANA     B
        MVI     B, 0AH
        CMP     B
        JNC     ALPH
        ADI     30H
        CALL    TVDSP
        RET
ALPH
        SUI     0AH
        ADI     01H
        CALL    TVDSP
        RET

VAL     DB      0
LAST    DB      0
```

アセンブラはやっぱり苦手です。ださださなコードですみません。

とはいえ、ちゃんとEX-80のプログラム書いたのは初めてかもしれない。めんどくさいこと苦手で、当時ハンドアセンブルとかできませんでした。40年越しのプログラミングです。

MBAのasm8080でアセンブリしてexldaでFTDIモジュールからEX-80にダウンロードして実行してみます。

ボタンを押すと反応するのでおそらくちゃんと動いているのではないかと思われます。

![8279.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/92f822e9-e4f4-46e6-8ab0-d6a5054b4f0d.jpeg)

通常は00でキーを押すとまず40が返ってきてこれはキーの入力があったことをしめして、次にFIFOのデータの数を返すようです。データを読むと00に戻ります。

私のEX-80は廉価版の7セグが無いタイプのもので、本当は7セグを試したかったのですが、8279はカソードコモンな7セグが必要で手持ちがなかったので、とりあえずkeyboardだけ試してみました。

EX-80の7セグはフェアチャイルド社のDM9368というIC二つでドライブしているのですが、このICはすでにディスコンで手に入りません。DM9368はΛ-1でも使われていて、マイコン創成期に一世を風靡したチップでした。

7セグの点灯につていはこちらが参考になります。

http://jsdiy.web.fc2.com/avr_7seg8test/

シンクドライバのTD62083AFGはストックがありますが、ソースドライバのTD62783AFGはないのでこれも手に入れる必要があります。

また秋葉に行ける日が来ますように。
【Rails】APIモードでcookieを使う

# 環境

- Rails 5.2.3

# 前提

- Rails を [APIモード](https://railsguides.jp/api_app.html)で使っている（←のドキュメントの[英語版](https://guides.rubyonrails.org/api_app.html)）。

または

- `ActionController::API`を継承して API用のcontrollerを使っている。

# 問題/やりたいこと

そのままでは [cookies](https://api.rubyonrails.org/v5.2.3/classes/ActionDispatch/Cookies.html)にアクセスできないので、アクセスできるようにしていきます。

# やり方

ここでは後者（`ActionController::API`を継承して API用のcontrollerを使っている）前提とします。

## ActionController::Cookies を include する

`ActionController::API`を継承しているベースコントローラー、または実際に`cookies`にアクセスしたいコントローラーで`include ActionController::Cookies`します。

つまり

```ruby
  class YourApiBaseController < ActionController::API
    include ActionController::Cookies
```

または

```ruby 
  class YourApiController < YourApiBaseController
    include ActionController::Cookies
```

## アプリケーションで ActionDispatch::Cookies を使えるようにする

```ruby:config/application.rb
module YourApi
  class Application < Rails::Application
    config.middleware.use ActionDispatch::Cookies
```

## その他

別途 `session_store` と `credentials.yml.enc` （旧バージョンの場合は `secrets.yml*` ）の設定はされている必要があります。

```ruby:config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: 'your-cookie-key-comes-here'
```
ESA SNAPで Python API を利用するための環境構築でのPython 3.4.0インストールエラーの回避方法

# ESA SANPを利用し、Pythonを利用しようとした時のエラーの原因と解決方法

## 課題 ESA SNAPをインストール、Python APIを有効にするにチェック
しかし、サポートしているバージョンが2.7, 3.3, 3.4と古かった。

## 問題　asdfによるバージョン管理でpython 3.4.0インストールでエラー
```
asdf install python 3.4.0
```
インストールするも、次のエラーが表示

```
Ignoring ensurepip failure: pip 1.5.6 requires SSL/TLS
```
## 原因１ High Sierra以降の macOSはOPENSSLをデフォルトでインストールしなくなった
## 原因2 brew install opensslでインストールされるopenssl openssl@1.1/1.1.1dはpython 3.5　からサポート（3.4.0ではopensslライブラリバージョン1.0.2mとdevelパッケージが必要）
## 解決方法

1. openssl@1.1/1.1.1dが既にインストール済みの場合のみ実施

```
brew uninstall --ignore-dependencies openssl@1.1
rm -rf /usr/local/etc/openssl
```

2. git から直接ダウンロード

```
git clone https://github.com/Homebrew/homebrew-core.git
cd homebrew-core/
git checkout 75b57384 Formula/openssl.rb
brew install Formula/openssl.rb
```
3. asdfが入っている事を前提としてますが、次のコマンドで3.4.0をインストール

```
asdf install python 3.4.0
asdf global python 3.4.0
```

以上
備忘録として

参考サイト
StackOverflow
* https://stackoverflow.com/questions/60413223/ignoring-ensurepip-failure-pip-requires-ssl-tls-python-3-4-x-with-pyenv-on-os
* https://stackoverflow.com/questions/59337838/openssl-1-0-2m-on-macos
* https://stackoverflow.com/questions/60413223/ignoring-ensurepip-failure-pip-requires-ssl-tls-python-3-4-x-with-pyenv-on-os

SNAP関連
* http://step.esa.int/main/
* http://130.158.200.25/~torarimon/?ESA+SNAP%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A4%C8%BB%C8%A4%A4%CA%FD
[k8s]label を使ってリソースを探すときのメモ

k8s で label を使ってリソースを探すときのメモ書き。
`k get --help` で詳細が確認出来るので忘れたらこれで確認するのがベストだが一応メモしておく。

# 環境

```bash
# kubectl は k として alias の設定をしている環境
$alias |grep kubectl
k=kubectl

# Pod　は以下のように作成
$k run nginx-pod --image=nginx:alpine --generator=run-pod/v1
$k run dev-redis --image=redis:alpine --generator=run-pod/v1 --labels="tier=db,env=dev"
```

# リソースの指定

```bash
# Pod の表示
$k get pods
NAME        READY   STATUS    RESTARTS   AGE
dev-redis   1/1     Running   0          20m
nginx-pod   1/1     Running   0          22m

# 全てのリソースを表示. service も表示されている
$k get all
NAME            READY   STATUS    RESTARTS   AGE
pod/dev-redis   1/1     Running   0          20m
pod/nginx-pod   1/1     Running   0          22m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   13d

# そもそもどんなリソースがサポートされているかは以下によって確認できる。このコマンドは k get --help でも記載あり(長いので結果は割愛）
$kubectl api-resources
```

# ラベルの表示

`-L` オプションを指定することで特定ラベルの表示が出来る。
また、 `--show-labels=true` によって全てのラベル、値の確認が出来る

```bash
# Pod の env というラベルの値を表示
$k get pods -L env
NAME        READY   STATUS    RESTARTS   AGE   ENV
dev-redis   1/1     Running   0          15m   dev
nginx-pod   1/1     Running   0          18m

# --show-labels=true を付ける事で設定されているラベルが確認出来る
$k get all --show-labels=true
NAME            READY   STATUS    RESTARTS   AGE   LABELS
pod/dev-redis   1/1     Running   0          16m   env=dev,tier=db
pod/nginx-pod   1/1     Running   0          18m   run=nginx-pod

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   LABELS
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   13d   component=apiserver,provider=kubernetes
```

# ラベルによるフィルタリング

`-l` オプションによりフィルタリングが出来る
複数ラベルの指定可能。

```bash
# env ラベルが dev となっている Pod を表示
$k get pods -l env=dev
NAME        READY   STATUS    RESTARTS   AGE
dev-redis   1/1     Running   0          17m

# ラベルが env=dev,tier=db の Pod を表示
$k get pods -l env=dev,tier=db
NAME        READY   STATUS    RESTARTS   AGE
dev-redis   1/1     Running   0          18m
```
Oracle SQL, PL/SQL の予約語

Oracle SQL, PL/SQL の予約語はテーブル名、列名など(正確にはOracle Objects)のネーミングに使ってはならない。

[Oracle19C SQL 予約語](https://docs.oracle.com/cd/F19136_01/sqlrf/Oracle-SQL-Reserved-Words.html#GUID-55C49D1E-BE08-4C50-A9DD-8593EB925612)
[Oracle19C PL/SQL 予約語](https://docs.oracle.com/cd/F19136_01/lnpls/plsql-reserved-words-keywords.html#GUID-9BAA3A99-41B1-45CB-A91E-1E482BC1F927)

[Oracle18C SQL 予約語](https://docs.oracle.com/cd/E96517_01/sqlrf/Oracle-SQL-Reserved-Words.html#GUID-55C49D1E-BE08-4C50-A9DD-8593EB925612)
[Oracle18C PL/SQL 予約語](https://docs.oracle.com/cd/E96517_01/lnpls/plsql-reserved-words-keywords.html#GUID-9BAA3A99-41B1-45CB-A91E-1E482BC1F927)

[Oracle12.2 SQL 予約語](https://docs.oracle.com/cd/E82638_01/sqlrf/Oracle-SQL-Reserved-Words.html#GUID-55C49D1E-BE08-4C50-A9DD-8593EB925612)
[Oracle12.2 PL/SQL 予約語](https://docs.oracle.com/cd/E82638_01/lnpls/plsql-reserved-words-keywords.html#GUID-9BAA3A99-41B1-45CB-A91E-1E482BC1F927)

[Oracle12.1 SQL 予約語](https://docs.oracle.com/cd/E57425_01/121/SQLRF/ap_keywd001.htm#BABCJAEB)
[Oracle12.1 PL/SQL 約語](https://docs.oracle.com/cd/E57425_01/121/LNPLS/reservedwords.htm#GUID-9BAA3A99-41B1-45CB-A91E-1E482BC1F927)

[Oracle11.2 SQL 予約語](https://docs.oracle.com/cd/E16338_01/server.112/b56299/ap_keywd001.htm#BABCJAEB)
[Oracle11.2 PL/SQL 予約語](https://docs.oracle.com/cd/E16338_01/appdev.112/b56260/reservewords.htm#CHDBBJFE)

[Oracle11.1 SQL 予約語](https://docs.oracle.com/cd/F25597_01/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/ap_keywd.htm#384)
[Oracle11.1 PL/SQL 予約語](https://docs.oracle.com/cd/F25597_01/document/products/oracle11g/111/doc_dvd/appdev.111/E05670-03/reservewords.htm#CHDBBJFE)

[上記以外](https://www.oracle.com/jp/documentation/manual.html)
Log4j 1.2.12 のadditivity, ConsoleAppender 

注: [On August 5, 2015 the Logging Services Project Management Committee announced that Log4j 1.x had reached end of life. ](https://logging.apache.org/log4j/1.2/manual.html
) / [Log4jバージョン1のサポートは終了](https://www.infoq.com/jp/news/2015/09/log4j-version-1-reaches-eol/)
...なのだけど今更log4j-1.2について調べている。

元々
`log4j-1.2.8`
しか居なかったアプリケーション上に

`log4j-1.2.12`
が同梱されたことにより何か振る舞いがおかしい。
ログが２重に出る。そして意図せずSystemOutに出る...
この２点に関するメモです。


### ２重に出る

まず２重に出る点、関係していそうなのはこの辺。`Additivity`

[log4jのLoggerの階層構造とadditivityの振舞について](http://gungnir-odin.hatenablog.com/entry/20130117/1358425827)

[Additivity is set to true by default, that is children inherit the appenders of their ancestors by default. ](https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#additive)
Additivity はデフォルトで true に設定されており、子はデフォルトで先祖のアペンダーを継承します。

### 意図せずSystemOutに出る

SystemOutのほうは、[log4j変更履歴](https://logging.apache.org/log4j/1.2/changes-report.html) を見てみると以下が怪しい。

引用。

- 1.2.12 `TRACE level introduced, ConsoleAppender modified to follow redirection of System.out` TRACE レベルが導入され、ConsoleAppender が System.out のリダイレクトに追従するように変更されました。
- 1.2.13 `TRACE level missing info fixed, ConsoleAppender.follow added to make redirection following an optional behavior.` TRACEレベルの欠落情報を修正し、ConsoleAppender.followを追加し、任意の動作に続くリダイレクトを行うようにしました。
- [log4j version 1.2.13](http://repository.transtep.com/repository/thirdparty/logging-log4j-1.2.13/docs/download.html) Bug #37122 : Console appender now behaves as before to fix compatibility problem with JBoss introduced in 1.2.12 release due to fix for bug 31056. Can still be configured to detect changes in the System.out and System.err streams as needed by setting the follow property. ConsoleAppender は、バグ 31056 の修正により 1.2.12 リリースで導入された JBoss との互換性の問題を修正するため、以前のように動作するようになりました。以下のプロパティを設定することで、必要に応じて System.out および System.err ストリームの変更を検出するように設定できるようになりました。

ConsoleAppender の動きがやはり変わっていたように見える。[^1]
ここで `1.2.17` を試す範囲では挙動は `1.2.8` と同様に戻る。


### 互換性

[API/ABI changes review for log4j ](https://abi-laboratory.pro/index.php?view=timeline&lang=java&l=log4j)

業務上もう `1.2.17` に上げてしまってよいのか、一旦、ここまでに調べたことを書いておく。またLog4j には[信頼性のないデータのデシリアライゼーションに関する脆弱性](https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-013606.html) というのがあるらしいが一応該当していなそうだったのでそれもメモ。


## ハングする

Bug 50213 - Category callAppenders synchronization causes java.lang.Thread.State: BLOCKED
https://bz.apache.org/bugzilla/show_bug.cgi?id=50213
log4j の該当箇所
http://svn.apache.org/viewvc/logging/log4j/tags/v1_2_17/src/main/java/org/apache/log4j/Category.java?revision=1342873&view=markup#l391



[^1]: [Appender](https://www.techscore.com/tech/Java/ApacheJakarta/Log4J/1-2/)
初心者によるプログラミング学習ログ 330日目

#100日チャレンジの330日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
330日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>330日目 2h<br>・ポートフォリオ作成2h:制作物一覧部分作成<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1266462862739828736?ref_src=twsrc%5Etfw">May 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Rubyプログラム内で別のコマンドを起動する方法

Rubyプログラム内で別のコマンドを起動する方法について．
主に `popen`について書く

# 方法1: system()関数
system()関数にコマンドを文字列で与える．
最も簡単。
## 例1 引数無し
```ruby:sys0.rb
system("ls")
```

実行すると
>ruby sys0.rb
>>a.txt  b.txt  c.txt  sys0.rb  sys1.rb  sys2.rb

## 例2 引数あり
```ruby:sys1.rb
system("ls *.txt")
```

実行すると
>ruby sys1.rb
>>a.txt  b.txt  c.txt

## 例3 終了ステータスの取得
Exit status (終了ステータス, 脱出ステータス)は `$?` で取得できる

```ruby:sys2.rb
system("ls abc")
print $?, "\n"
```

実行すると
>ruby sys2.rb
>>ls: cannot access abc: No such file or directory
>>pid 13715 exit 2

lsは失敗し終了ステータス2が得られている.

# 方法2 popen
実行したコマンド(子プロセス)の出力を得たり，入力したりできる．
要は，標準入出力にread/writeできる．

## 例1 結果を得る．標準出力からread
```ruby:popen0.rb
IO.popen("ls","r") do | io |
        while io.gets do
                print
        end
end
```
実行すると
>ruby popen0.rb
>>a.txt
>>b.txt
>>c.txt
>>popen0.rb
>>sys0.rb
>>sys1.rb
>>sys2.rb

## 例2 標準入出力にread/write
```ruby:popen1.rb
IO.popen("grep e","r+") do | io |
        io.print "Hello,\n"
        io.print "World!\n"
        io.close_write
        while io.gets do
                print
        end
end
```
実行すると

>ruby popen1.rb
>>Hello,


# 方法3 fork and exec
## 例1 forkのみ
```ruby:fork0.rb
print "Start!\n"
child_pid = fork do
  #以下 子プロセスのみが実行
  print "I am a child. pid=", Process.pid, "\n"
  sleep(1)
  #以上 子プロセスのみが実行
end
#以下 親プロセスのみが実行
print "I am a parent. my pid=", Process.pid, ", my child's pid=", child_pid, "\n"
Process.waitpid(child_pid) #子プロセスの終了を待つ
```
実行すると
>ruby fork0.rb
>>Start!
>>I am a parent. my pid=25527, my child's pid=25529
>>I am a child. pid=25529

## 例2 fork and exec
```ruby:fork1.rb
print "Start!\n"
child_pid = fork do
  #以下 子プロセスのみが実行
  exec("ls")
  #以上 子プロセスのみが実行
  #以下 実行されない
  abc()
  #以上 実行されない
end
#以下 親プロセスのみが実行
print "I am a parent. my pid=", Process.pid, ", my child's pid=", child_pid, "\n"
Process.waitpid(child_pid) #子プロセスの終了を待つ
```

実行すると
>ruby fork1.rb
>>Start!
>>I am a parent. my pid=25801, my child's pid=25803
>>a.txt  b.txt  c.txt  fork0.rb  fork1.rb  popen0.rb  popen1.rb  sys0.rb  sys1.rb  sys2.rb
エラーの調べ方

#はじめに
プログラミングや環境構築等をしていると、ほぼ必ず発生するエラー。
私はプログラミングで一番大切なのは、エラーを読んで解決する能力だと思っています。
(個人的な意見です。)

経験が浅いと、エラーを読んでもよくわからない、調べ方が分からない、といった悩みがあると思います。
私もプログラミングを始めてすぐは、エラーが出たらどうしたらよいかわからず手が止まっていました。
英語の能力も高くないので、よくわからない単語が並んでいる英文が何行も出力されるのが憂鬱でした。

しかし、エラーの調べ方のコツをつかめるようになると自力でエラーを解決できるようになりました。

この記事ではエラーが出力されたときに、何をすればいいかを順に書いていきます。

##対象者
プログラミングを初めてすぐ初心者。
エラーが出ると手が止まってしまう人。

##投稿者
プログラミングを初めて1年半の新人エンジニアです。
まだ知識も乏しいため、間違っている点があったらご了承ください。
もし「もっといい調べ方がある」、「この記事間違っている」というご指摘がある方は
ぜひコメントをお願いします。


#1.エラーの調べ方
##a.エラーが1行の時の調べ方
###(1)エラー1文全部コピーして検索する。
具体的なエラーが書いてあり、特定の言語のみで出力されるエラーの場合この方法で原因が分かることが多いです。


このように検索すると、stack-overflowのページが検索上位に出てくることが多いです。
stack-overflowはプログラマーの知恵袋のようなサイトで、
分からないことを投稿すると、詳しい人が解決方法を教えてくれます。


stack-overflowを読めば原因と解決方法が同時に分かることが多いです。
とても便利なサイトですが、ほぼ全ての投稿が英語のため、
英語が苦手な人は見るだけで頭が痛くなると思います。。
(私もそうなので。。ただでさえ分からないのに、英語とか本当に無理)


そんな時は自動翻訳に頼りましょう！！
知っている人も多いと思いますが、よく使うツールを紹介します。

**・Google翻訳**
Chromeを使っている場合、ブラウザ上で翻訳されるので使いやすいです。
ただ訳の正確性に少しかけると思います。
また原文と和訳を見比べたい時に、いちいち操作が必要なため使いにくい時もあります。

**・[DeepL](https://www.deepl.com/ja/translator)**
最近はもこちらを使うことが多いです。
砕けた文章を翻訳する場合DeepLの方が正確だと思います。
(stack-overflowは砕けた表現が多いので)
サイト上でも翻訳できるのですが、DeepLのアプリがおすすめです。
翻訳したい箇所を選択し、ctrl + cを2回押すとアプリが自動的に起動し翻訳してくれます！！





###(2)エラーに使っている言語名、フレームワーク等を加えて検索
(1)で出てこないときは、他の言語のエラーがまぎれていることが多いです。
その時は(1)に言語、フレームワーク等を加えて検索しましょう。


###(3)エラーの中から単語を抜き出し使っている、言語名等を追加
エラーの中からなんとなくエラーの原因になりそうな言葉を抜き出し、
(2)のように言語等を加えて検索します。
そうするとエラーの原因になりそうなことが検索結果に出てきます。



##b.エラーが複数行あるとき
###(1)エラー原因が書いてある場所を探す
複数行出力されるエラーは原因のが書いてある箇所が分かりにくいと思います。
また何十行もあっても、エラー原因がかいてある部分は大体2、3行です。
エラーの原因が書いてあるのは
**「Error」「Exception」がついている部分の最初か最後に出力されてあることが多いです。**


少し大変ですが、上から順に読んでErrorやExceptionと書いてある部分を探してください。
見つけられたら、その部分を重点的に読めばよいのですが長くわかりにくいと思います。


エラーの構造は以下のようになっていることが多いです。
**発生した問題>問題の具体的な内容>エラーの具体的な内容**
※この順番と異なることもあります。

エラーの原因が見つかれば、1行の時と同様に(2)(3)のように検索すれば大丈夫です。



#2.検索しても分からなかったとき
1.の方法で見つからなかった場合、出力されたエラー以外から原因を探ります。
##(1)環境差分がないか探す
バージョン、OS、使っているエディター等によってエラーが出ることがあります。
その場合は使っている言語のバージョンや、「{言語名}　Windows」のように検索すると
原因が見つかることがあります。


##(2)公式ドキュメントを読む
公式ドキュメントが1番正確な情報で、情報量も多いと思います。
関係がある場所までたどりつくのが大変だと思いますが、
読み進めていくと仕様の理解が深まり原因がみつけやすくなります。



#3.誰かに質問するとき
もし身近に質問できる人がいる場合、以下のリンクに記載されていることに注意しましょう。
https://twitter.com/akiraokumura/status/1253144995197935617?s=21
内容を抜粋すると
>質問するときは
>・実行した内容(ソース、コマンド等を具体的に)
>・エラー内容
>・実行環境
>を伝えること。
とのことです。

もし身近に質問できる人がいない場合、
[teratail](https://teratail.com/)で質問することもできます。



#参考リンク
[エラーメッセージの読み方と対処, 検索や質問の原則](https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5)が分かりやすいので、とてもおすすめです。
こちらの記事の方が具体的に書いてあるのでとても役に立つと思います。


#おわりに
先輩から教えてもらったエラーの調べ方がとても分かりやすかったので、まとめてみました。
Ubuntu18.04にtensorRTをインストールした

Ubuntu18.04にCUDA10.1+cuDNN7.6.5をインストールしてtensorflow-GPU 2.1を入れて使おうとしたところ、import tensorflowした際にlibnvinfer6が読めなかったと警告メッセージが出ました。

これはtensorRTが入ってない為にフルに機能が使えないという警告のようですので、tensorRTをインストールしました。

なお、こちらのStep3の手順そのままです
https://ddkang.github.io/2019/09/19/installing-tensorrt.html

## 手順

TensorRTのインストーラーdebファイルを以下のサイトからダウンロードします
https://developer.nvidia.com/nvidia-tensorrt-6x-download

落としてきたdebファイルをdpkgで実行します。
以下ではdebファイルがカレントディレクトリにある状態で、tensorRT6.0.1.5 for cuda10.1をインストールしています。

```terminal:terminal
sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb
sudo apt update
sudo apt install tensorrt libnvinfer6
```
僕の環境ではこれで入ってくれました
VSCodeでPython (Windows10)

私のスペック
Pythonは元々Anacondaでたまに利用。
主流はRでRStudio。
そんな中でPythonの必要性が高まり（Deepね）、RStudioのような感じで使えるというVScodeを使ってみようかなと。Markdownもキレイだし。

ダウンロードとインストールは簡単。以下から。
[Visual Studio Codeダウンロードサイト](https://code.visualstudio.com/)

僕の場合は既にAnacondaが入っていたからそことは別の環境でPythonやりたいってのがあって新たにPythonをインストールした。
（VScodeではこのPythonを使うってこと。使用用途が違うのでというのが一番なのだが）
[Pythonダウンロードサイト](https://www.python.jp/install/windows/install_py3.html)
自信がない人はインストールする際に「Add to PATH」とか書いてある所にチェックするといい。PATH通ってないから動かないって事が多々あるので。

Anacondaではパッケージ管理などが基本的に`conda`ベースとなる。
これはAnaconda社のペースによるので使えないパッケージなどが出てくる。そうすると`pip`を使うしかないわけで。。
（Anacondaでもpipは使えるのだが）
Anaconda(jupyter Notebook)は共有の観点からはとても便利なのでそっちでは`.ipynb`(jupyter Notebook)を使ってる。

多分、Pythonの環境構築ってのは初めてプログラミングとかデータ解析する人にはとても大変で、ある程度コンピュータの気持ちをわかってやれる人になってほしい。コンピュータは何も悪くないからねｗ
だからこそAnaconda (jupyter Notebook)がPythonの入りとしてはよいのだけどそれじゃ不満って人は先に進まないとね。Anacondaの対応待ってますじゃ先へは進めない。
まぁ、VScodeでいいの？ってのはわからんがｗ

とりあえずVScodeでPython動かすのは簡単。
フォルダを適当に作って、適当なPythonファイル（`ファイル名.py`）を新規作成。コードは適当に

```Python:
a = "Hello zumilab."
print(a)
```

とか打って実行してみて。
インストールした新しいPythonをインタープリタで選択して（`Ctrl + Shift + P`）、あとは`F5` (`Fn + F5`)押してから`Enter`すれば実行できるはず。
Pythonの選択できていれば実行したい行にカーソル合わせて、`Shift + Enter`でも実行出来るはず。これ出来ないとRユーザーのメリットないもんね。

次は[仮想環境の構築とパッケージのインストール](https://qiita.com/nizu708/items/597f547584b1980a537e)を。
jQuery~初級編~

# プログラミングの勉強日記
2020年5月30日　Progate Lv.69

###jQuery
　ユーザーのクリックに表示されるフォームやアニメーションなどHTML/CSSだけでは表示できなかった動きを表現する。jQueryオブジェクトは`$('セレクタ')`とするだけで作成できる。セレクタにはHTMLのタグ名やクラス名などを指定し、それに合成したHTMLの要素がjQueryオブジェクトになる。jQueryのメソッドはjQueryオブジェクトでしか利用できない。メソッドを使うとjQueryオブジェクトの内容（HTMLの要素）を変更したり、アニメーションを付けたりすることができる。メソッドは`$('セレクタ').メソッド`のようにドットを付けて呼び出す。
　使い方：①jQueryオブジェクトの作成　②そのjQueryオブジェクトに対してメソッドを呼び出す
`$('セレクタ').メソッド(引数);`として使う。

#####hideメソッド
　要素を隠すことができる。
 `$('セレクタ').hide();`として使う。

#####fadeOutメソッド
　アニメーション付きで要素を隠す。後ろの（）内に引数としてアニメーションの速度をミリ秒や文字列で指定できる。
　`$('セレクタ').fadeOut();`として使う。

#####fadeInメソッド
　アニメーション付きで隠れた要素を表示する。表示する際に<font color=blue>徐々に表示するアニメーションを追加する。</font>
　`$('セレクタ').fadeIn();`として使う。

#####slideUpメソッド
　アニメーション付きで要素を隠す。fadeOutメソッドとは異なるアニメーションで、要素を隠すときに<font color=blue>下から上へスライドするアニメーションを追加する。</font>
　`$('セレクタ').slideUp();`

#####slideDownメソッド
　アニメーション付きで隠れた要素を表示する。表示する際に<font color=blue>上から下へスライドするアニメーションを追加する。</font>
　`$('セレクタ').slideDown();`として使う。

#####id
　HTMLのタグに名前をつける方法としてHTMLで使うclassのようなもの。classと同様に使うが、<font color=orange>同じid名を複数回使うことはできない。</font>そのため、idは同ページに1か所しかないので、jQueryの処理が高速化されるので、jQueryオブジェクトのセレクタにはidを用いる。<font color=orange>idはセレクタに`#`を用いる。</font>(クラスでいうドットと同じ役割を果たす。

#####showメソッド
　隠れた要素を表示する。表示したい要素に対して、`$('セレクタ').show();`と指定する。

#####イベント
　ある処理を行うタイミングを指定できる。WEBページ内でユーザーによってクリックなどの操作が行われたとき、あらかじめイベント内に指定した処理を実行する。`$('セレクタ').イベント名(function() {});`と書く。

#####clickイベント
　セレクタがクリックされたときに処理をする。

#####cssイベント
　CSSを変更できるメソッド。1つ目の引数にCSSのプロパティ名を2つ目の引数にプロパティ値を入れる。
　`$('セレクタ').css('プロパティ名','値');`

#####textメソッド
　HTMLそのものを更新することができる。
　`$('セレクタ').text('書きかえる文字列');`とかく。

#####htmlメソッド
　要素の中身のHTMLを書きかえることができる。textメソッドとは違って単なる文字列ではなくHTMLである。（文字列の中に<span>と書くとHTML要素として追加される。textメソッドでは<span>も文字列として扱われる。）

#####thisの構文
　`$(this)`はイベントの中でそのイベントが起こった要素を取得することができる。<font color=orange>`$()`の中でクォーテーションで囲まない</font>

#####変数を使う
　同じjQueryオブジェクトを複数回使用するときに使う。コードが見やすくなるだけでなく、jQueryの処理が高速化される。JSと同様に変数宣言には`var`を使う。jQueryオブジェクトを格納するときはわかりやすいように変数の頭に`$`をつける。

```javascript
$('div').css('color','red');
$('div').html('jQuery');
$('div').fadeOut();
```
```javascript
//変数を使用する
var $div=$('div');       //$((div')を変数にする
$div.css('color','red');
$div.html('jQuery');
$div.fadeOut();
```

#####メソッドチェーン
　処理速度をとても高速化できる。1つのjQueryオブジェクトに連続してメソッドが利用できる構文。
　`$('セレクタ').メソッド().メソッド()`とかくことでそれぞれのメソッドが適用される。

#####findメソッド
　すべての子孫要素（自分よりも下の階層すべて）の中から指定したセレクタを持つ要素を取得するときに使う。

#####childrenメソッド　
　指定したセレクタが持つ子要素（1階層だけ下）の中から指定したセレクタに合致した要素を取得したいときに使う。

#####hoverイベント
　要素にマウスがのったとき、外れたときに指定した処理を行うイベント。
　`$('セレクタ').hover(マウスをのせたときの処理,マウスを外したときの処理);`とかく。