Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21429 articles
Browse latest View live

本日の学習内容part2

$
0
0

参考記事

https://phpjp.com/sha1.php

パスワードの暗号化(sha1)

あるパスワードをDBに登録時に暗号化した(ハッシュ計算)後、ログイン画面で入力したパスワードがDBのパスワード(暗号化済み)と合っているかどうかをチェックする時は暗号化を行う。
login.php
if ($_POST['password'] !== '') {
$login = $db->prepare('SELECT * FROM members WHERE password=?');
$login->execute(array(
sha1($_POST['password'])
));
$member = $login->fetch();

感想

学習した内容を上手く文章に出来なくててもどかしい(笑) これからそのスキルも磨いていきたい。


AtCoder 生活 2日目

$
0
0

前回

二日目

今日は、とりあえずABC042_A,ABC043_A,ABC044_Aの三問だけ解いてみました。

ABC042_A

和風いろはちゃんイージー

最初から何もわからなかったのでとりあえず他人のコードを見ながら解きました。

#include <bits/stdc++.h>
usingnamespacestd;intmain(){intA,B,C;cin>>A>>B>>C;if((A==7&&B==5&&C==5)||(A==5&&B==7&&C==5)||(A==5&&B==5&&C==7)){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}

ここで、bits/stdc++.hの存在を知りました。
何に使っても基本OKなやつ。便利すぎる!

ABC043_A

キャンディーとN人の子供イージー

#include<bits/stdc++.h>
usingnamespacestd;intmain(){intN;cin>>N;cout<<(1+N)*N/2<<endl;}

bits/stdc++.hを知ってしまえばあとは簡単何も見ずに解けるように!

ABC044_A

高橋君とホテルイージー

#include<bits/stdc++.h>
usingnamespacestd;intmain(){intN;cin>>N;intK;cin>>K;intX;cin>>X;intY;cin>>Y;cout<<(K*X)+(N-K)*Y<<endl;}

もはや、算数を解いてる気分、、、

なんか一気に簡単に見えてきた
明日は、BやCの問題も解きたいなぁ

Arch Linux(8) Manjaro Budgie 19.0.2 をUSB メモリにインストール

$
0
0

はじめに

以前に、コミュニティ版の「Manjaro Cinnamon 19.0.1」や、「Manjaro Awesome 18.1.3」をUSB メモリにインストールしました。今回は同じ、コミュニティ版である「Manjaro Budgie 19.0.2」をインストールしてみました。

癖がないので、誰にでも使いやすいデスクトップ環境だと思い、「初心者」タグを付けました。少し問題はありましたが、解決できています。


Manjaro Budgie 19.0.2 のインストール

他のフレーバーに遅れて、やっと同じバージョンになりました。Ubuntu Budgieと同じデスクトップ環境が使われていますが、使い勝手がどう違うのか、楽しみです。


公式サイト

Manjaro 公式サイト

Manjaro Forum

Manjaro wiki


コミュニティ版

サポート対象外ですが、コミュニティ版の魅力は、好みのデスクトップ環境が選べることです。デスクトップ環境により、開発状況に差があって、バージョンに違いがあります。この辺りも選ぶポイントかも。

コミュニティ版のダウンロード:

Manjaro-Downloadsにて、右上の「横三本」をクリック
→Editions→Community

2020-03-19 現在:

  • Awesome 18.1.3

  • Budgie 19.0.2

  • Cinnamon 19.0.2

  • i3 19.0.2

  • LXDE 19.0.2

  • LXQt 19.0.2

  • MATE 19.0

  • Openbox 19.0.2


Budgie をダウンロード

ローリングリリースなので、基本的にはどの段階でも更新すれば最新になりますが、更新が少なくて済む、最新の状態のイメージが公開されているかもしれません。

manjaro-budgie-19.0.x Downloadで最新の「.iso」ファイルと「.iso.sha256」ファイルをダウンロードできます。

manjaro-budgie-19.0.2-200310-linux55.iso (2.24 GB)

チェックサムの確認:
(うまくダウンロードできたかの確認)

$ sha256sum manjaro-budgie-19.0.2-200310-linux55.iso
f43c47aa2e115038360f130dbeedd76cfc31935868a93232ebd7c072a51cc09d manjaro-budgie-19.0.2-200310-linux55.iso

インストール

インストーラーは、定番の Calamares です。インストールの途中で、「LibreOffice」または「FreeOffice」を選択できます。

FreeOffice」が出たのは知りませんでした。ツールバー形式だけでなく、リボン形式が使えるみたい。ただし、ODF化を進めるなら「LibreOffice」のようです。

1. ライブUSB メモリでブートすると、すぐに、テキストベースの「Welcome to Manjaro」画面が表示されます。

- Keytable = jp
- lang = 日本語 → ja_JP

としてから、
Boot: を選んで、Enter キー

2. デスクトップ画面が表示されます。

「Manjaro へようこそ!」画面が表示されます。
→ブート時の設定で日本語化されています。
もし、日本語の設定を忘れていたら、ウィンドウの左上で「Japanese」を設定すると日本語化されます。

3. インストール中にサスペンドして中断されないように、設定を変更します。

メニュー →システムツール →設定 →電源管理

自動サスペンド: オン(20分)→「オフ」に変更
電源ボタンの動作: サスペンド→「電源オフ」に変更
ブランクスクリーン: 5分 →「しない」に変更

→変更しないと、画面のオフの解除に、いちいちパスワード「manjaro」の入力が必要です。

4. インストール先となるUSB メモリ(fat32 で初期化済)を挿入。

メニュー →ユーティリティ →「ディスク」
→パーティション情報の画面が表示されます。

セットしたUSB メモリのデバイス名(例. /dev/sdc)を選択。メーカー名とか容量で判断できます。

  • インストーラで、USB メモリが認識されなかったり、置換メニューが表示されないときがあったので、ライブ上でも初期化します。
1. 「■」をクリックして、アンマウント。アンマウントで「▶」に変わります。
2. 「-」でFat32 を削除。
3. 「+」でfat を作成。
4. たぶん、アンマウントされたままなので、USB メモリを抜いて、再度、挿します。

もし、root のパスワードを聞いてきたときは、ライブ立ち上げの場合は「manjaro」です。

5. Budgie 19.0.2 では、このままインストーラーを起動すると、日本語文字が表示されず、英語のみの歯抜けの表示になります。

6. パネル →「端末」アイコンで、端末を起動。

  • 仮の日本語フォント(さざなみフォント)をインストール:
$ sudo pacman -Sy ttf-sazanami

→「S」は大文字です。インストールで、メニューや「Manjaro へようこそ!」で使われている日本語が細めのフォントに変化。きれいではありません。

7. 「Manjaro へようこそ!」画面にて、「インストーラーを起動」をクリック。日本語がちゃんと表示されています。


8. ようこそ:

「日本語」が自動セットされるまで待ちます。
→「次へ」


9. ロケーション:

地域: Asia、ゾーン: Tokyo
(地図で日本をクリックしても設定されます)
→「次へ」


10. キーボード:

キーボードモデル: Generic 105-key PC (intel.)
Japanese、デフォルト
「ここでタイプしてキーボードをテストしてください」→ @@ で確認。


11. パーティション:

ストレージデバイスを選択: (/dev/sdc) MBR

「パーティションの置換」にチェック

インストールするパーティションの選択
現在:「fat32 パーティション」の部分をクリック。

後:「Manjaro 29.0 GiB ext4」が赤く表示。

ブートローダーの場所: (/dev/sdc) ←忘れずに設定。


12. ユーザ情報:

任意設定

管理者パスワードは入力するか、または、「管理者アカウントと同じ」にチェック。
→「次へ」


13. Office Suite:

  • No Office Suite(オフィス インストールせず)

  • Libre Office

  • Free Office


14. 要約:

今までに設定した内容を確認。
画面に入りきれてないメッセージがあります。スクロールさせます。
「/dev/sdc にブートローダーをインストール」になっていることを確認。

→「インストール」
→「今すぐインストール」

インストールが開始されます。
→「すべて完了しました。」表示。
→「実行」
→「インストーラー」のウィンドウが閉じます。


15. シャットダウン

画面上のパネルの右にある「電源ボタン」アイコンをクリック→シャットダウン

電源が落ちたら、ライブUSB メモリだけ抜きます。


インストールしたUSB メモリで起動

電源オン。
ログイン画面にて、パスワード入力。

デスクトップ画面が表示:
01.jpg
→こちらの壁紙はお気に入りです。かわいいですね。パネルによく使うアプリが登録されているので便利です。シャットダウンは、画面右上の電源ボタンを使います。ログアウトはユーザ名に隠れているので注意。

すぐに、「Manjaro へようこそ!」画面が表示されます。
welcome.jpg
→一番下の「Applications」からは、定番のアプリのインストールが簡単にできます。


自動でサスペンドしないように変更

デフォルトは自動サスペンドです。自分のPC は「サスペンド」がサポートされておらず、運用中にサスペンドすると強制リセットと同じになります。それを避けるため、設定変更しました。

メニュー →システムツール →設定 →電源管理

  • 自動サスペンド: オン(20分)→「オフ」に変更
  • 電源ボタンの動作: サスペンド→「電源オフ」に変更
  • ブランクスクリーン: 5分 →「15分」に変更

端末: Terminal

端末は「GNOME 端末」です。

パネル →「端末」アイコン

端末で表示される文字のフォントを指定。

メニュー →設定 →「名前なし」タブ→「文字」タブ

「フォントを指定」にチェック。
「Droid Sans Mono Regular 11」
→好みのフォントと、文字サイズを選択。


テキストエディタ

「gedit」です。

色のスキーム(XML)を追加できますが、どこにでも置けます。
クールな網目の表示の機能があります。
画面右に大きめのスクロールバーである「ミニマップ」が表示できます。
専用のプラグインが使えます。

ちなみに、アプリによって日本語名が変わります。
テキストエディター: gedit
テキストエディタ: xed 他


ファイルマネージャ

「ファイル」です。

パネル →「ファイル」アイコン

右クリックで、端末を開いたり、root管理者で開いたりできます。便利。

/usr/share/applications/ にて、「.desktop」ファイルの一覧が、アイコンで表示されません。けっこう不便。


ブラウザ

「firefox」です。


システム更新

画面右上の「盾」アイコンの中が「i」になり、青い点が付くと、システム更新(アップデート)があることを示します。クリックで開いて好きな時点でシステム更新を行えます。

システム更新の数が少ないときは更新が終わってからでもよいですが、もし、更新が多いときは、下記の「ミラーサーバの見直し」を先にやっておくと、幸せになれます。


ミラーサーバの見直し

ほとんどのディストリビューションのデフォルトのミラーは、本家の近くに設定されていて、日本にするより安定していることが多いのですが、Manjaro は違います。

わざと遅い国のミラーに分散しているフシがあります。もしかしたら、負荷分散か、向こうからすると速い設定なのかもしれません。

なので、デフォルトの設定だと、システム更新時のリポジトリの更新がやけに遅くなります。また、デフォルトのミラーは決まっておらず、インストールしたときに決まるみたいです。

参考:

Manjaro Pacman-mirrorsコマンドによるミラーサーバーリストの更新

pacman はシステムの更新やソフトウェアをミラーサーバからダウンロードしますが、そのサーバの選択に Mirrorlist(/etc/pacman.d/mirrorlist)ファイルが使われています。

下記により、自動的に利用可能な全てのミラーサーバをチェックして、「/etc/pacman.d/mirrorlist」を速いサーバから順に更新できます。住んでいる地域とか時間帯によって結果は変わるので、よく利用する曜日と時間帯に実施すると効果が大きいと思います。


1. 現在のMirrorlist を確認:
$ cat /etc/pacman.d/mirrorlist

##
## Manjaro Linux default mirrorlist
## Generated on 2020-03-20 04:46
##
## Please use 'pacman-mirrors -f [NUMBER] [NUMBER]' to modify mirrorlist
## (Use 0 for all mirrors)
##

## Country : South_Korea
Server = https://mirror.d-tl.com/manjaro/stable/$repo/$arch

## Country : Bulgaria
Server = https://mirrors.netix.net/manjaro/stable/$repo/$arch

## Country : Austria
Server = http://mirror.easyname.at/manjaro/stable/$repo/$arch

→設定されていた国の 2つは、とても遅い国でした。これらがデフォルトとは決まっておらず、違う日にインストールすると、違う国になりました。そしてほとんどが遅い国。ライブ立ち上げ時に決まるみたい。わざと散らして負荷分散しているのかも?

ライブ立ち上げで、リポジトリの同期をとったとき、遅かったり失敗するときは、再起動すれば速くなる可能性があります。


2. 保険として、作業前にMirrorlist を保存:
$ sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-ORG

$ ls -1 /etc/pacman.d/
gnupg
mirrorlist
mirrorlist-ORG

→遅くてもインストールで使えた実績があります。


  1. Mirrorlistの更新:
$ sudo pacman-mirrors --fasttrack && sudo pacman -Syy

表示されるメッセージ(一部省略):

::INFO Downloading mirrors from repo.manjaro.org
::INFO Using default mirror file
::INFO Querying mirrors - This may take some time
  1.928 France         : https://manjaro.mcofficer.me/
  3.171 Sweden         : https://ftp.lysator.liu.se/pub/manjaro/
  3.245 Brazil         : https://manjaro.c3sl.ufpr.br/
  1.588 Taiwan         : http://free.nchc.org.tw/manjaro/
  1.677 United_States  : https://repo.ialab.dsu.edu/manjaro/
  1.435 Hong_Kong      : http://ftp.cuhk.edu.hk/pub/Linux/manjaro/
  0.940 Thailand       : https://mirror.kku.ac.th/manjaro/
  0.876 Thailand       : http://mirror.kku.ac.th/manjaro/
  1.933 Thailand       : ftp://mirror.kku.ac.th/manjaro/
  0.219 Japan          : http://ftp.riken.jp/Linux/manjaro/
  0.852 Japan          : ftp://ftp.riken.jp/Linux/manjaro/
  0.219 Japan          : http://ftp.tsukuba.wide.ad.jp/Linux/manjaro/
  3.155 Germany        : https://manjaro.moson.eu/
  2.372 Hungary        : https://quantum-mirror.hu/mirrors/pub/manjaro/
  0.828 Bangladesh     : http://mirror.xeonbd.com/manjaro/
  2.956 France         : https://mirror.oldsql.cc/manjaro/
  0.711 South_Korea    : https://mirror.d-tl.com/manjaro/
  2.650 China          : https://mirrors.tuna.tsinghua.edu.cn/manjaro/
  1.762 Austria        : http://mirror.inode.at/manjaro/
  ..... Austria        : http://mirror.easyname.at/manjaro/
  3.051 Bulgaria       : https://manjaro.ipacct.com/manjaro/
  2.658 Bulgaria       : https://mirrors.netix.net/manjaro/
  2.643 Italy          : https://manjaro.mirror.garr.it/mirrors/manjaro/
:

::INFO Writing mirror list
::Japan           : http://ftp.tsukuba.wide.ad.jp/Linux/manjaro/stable
::South_Korea     : https://mirror.d-tl.com/manjaro/stable
::Bangladesh      : http://mirror.xeonbd.com/manjaro/stable
::Japan           : http://ftp.riken.jp/Linux/manjaro/stable
::United_States   : https://mirrors.gigenet.com/manjaro/stable
::Singapore       : https://download.nus.edu.sg/mirror/manjaro/stable
::Indonesia       : https://mirror.deace.id/manjaro/stable
:

::INFO Mirror list generated and saved to: /etc/pacman.d/mirrorlist
[sudo] USER_NAME のパスワード:
:: パッケージデータベースの同期中...
 core                               169.9 KiB  1082 KiB/s 00:00 [##################################] 100%
 extra                             1974.4 KiB   689 KiB/s 00:03 [##################################] 100%
 community                            5.8 MiB  4.62 MiB/s 00:01 [##################################] 100%
 multilib                           193.5 KiB  2.28 MiB/s 00:00 [##################################] 100%

→数字が小さい方が速く、「.....」は通信不可みたい。日曜だと中国や香港は遅いのですが、平日になるとベスト10 に入りました。人口が多いからかバラツキが大きいようです。自分のよく使用する曜日とか、時間とかに、実施するのがポイント。
しかし、デフォルトの設定をみると、ほとんどが遅い国(Bulgaria、Austria)です。かろうじて残りの国(South_Korea)がカバーしています。そこがコケたら通信障害になりそう。


3. Mirrorlist の修正:

リストが長いので、速い 5件に収めました。

$ sudo gedit /etc/pacman.d/mirrorlist
[sudo] USER_NAME のパスワード:

修正後の内容:

/etc/pacman.d/mirrorlist
##
## Manjaro Linux default mirrorlist
## Generated on 2020-03-20 17:22
##
## Please use 'pacman-mirrors -f [NUMBER] [NUMBER]' to modify mirrorlist
## (Use 0 for all mirrors)
##
## Country : Japan
Server = http://ftp.tsukuba.wide.ad.jp/Linux/manjaro/stable/$repo/$arch## Country : South_Korea
Server = https://mirror.d-tl.com/manjaro/stable/$repo/$arch## Country : Bangladesh
Server = http://mirror.xeonbd.com/manjaro/stable/$repo/$arch## Country : Japan
Server = http://ftp.riken.jp/Linux/manjaro/stable/$repo/$arch## Country : United_States
Server = https://mirrors.gigenet.com/manjaro/stable/$repo/$arch

→日本のミラーはすべて速いと思いますが、なぜか、プロトコルがftp のURL は除かれてます。


4. システムのデータベースとManjaro リポジトリ(Manjaro サーバ)を同期:
$ sudo pacman -Syyu

[sudo] USER_NAME のパスワード:
:: パッケージデータベースの同期中...
 core                               169.9 KiB  1277 KiB/s 00:00 [##################################] 100%
 extra                             1974.4 KiB  7.50 MiB/s 00:00 [##################################] 100%
 community                            5.8 MiB  5.25 MiB/s 00:01 [##################################] 100%
 multilib                           193.5 KiB   382 KiB/s 00:01 [##################################] 100%
:: システム全体の更新を開始...
 何も行うことがありません

再起動。


もし、依存関係で衝突していたら「pamac-manager」 に任せたほうが無難です

「pacman」コマンドは、更新で衝突があったときは、削除するか聞いてくるだけです。
自己判断で、ヘタに削除すると、今度は削除したパッケージに依存したパッケージがごっそり抜けます。処理も時間がかかり、失敗します。
依存関係は削除する順番があるようです。

pamac-manager は、どういうふうに衝突しているかを考えて、更新してくれます。

1. 削除しない状態で終わらせます。

2. 再起動。

3. メニュー →その他 →「ソフトウェアの追加と削除」(pamac-manager)

4. 「Pamac」マネージャで、右上の「3つの点」アイコンをクリック→「データベースをアップデートする」→パスワード入力

リポジトリとデータベースが同期されます。

  • core
  • extra
  • community
  • multilib

5. 更新があるかの確認で、「循環依存」が検出されます。自動で削除するパッケージの順番を考えて更新してくれます。

6. 無事に更新が完了


「yay」をインストール

Arch Linux にはコミュニティで作られた(まだ、リポジトリに登録されるまでに信用されていない?)ソフトのインストールを支援するツールがあります。ユーザが作ったスクリプト(PKGBUILD)に従い、インストールを行うツールで、「AUR ヘルパー」と呼ばれます。

以前は、「yaourt」(ヨーグルト) というヘルパーがありましたが、今はリポジトリから削除されています。代わりの候補は多く、その中では「yay」が有力みたい。AUR から早々と公式リポジトリに登録されました。使うにはインストールが必要です。

「yay」は、「yaourt」のパラメータと互換があって移行しやすく、公式リポジトリも扱えるように、pacman も内部から起動するので、コマンドを統一できる利点があります。アプリのインストールで、sudo をつける必要もありません。go 言語で書かれているみたいです。

ちなみに、「AUR」リポジトリから信用を得て昇進すると、公式リポジトリの「community」リポジトリに登録され、pacman でインストールできるようになります。

確認:

$ pacman -Ss yay
:
community/yay 9.4.6-1
    Yet another yogurt. Pacman wrapper and AUR helper written in go.

インストール:

$ sudo pacman -S yay
:
:: インストールを行いますか? [Y/n] Y

インストールの確認:

$ yay -Ss yay
:
aur/yay 9.4.6-2 (+995 57.10%) (Installed: 9.4.6-1)
    Yet another yogurt. Pacman wrapper and AUR helper written in go.

community/yay 9.4.6-1 (2.2 MiB 6.3 MiB) (Installed)
    Yet another yogurt. Pacman wrapper and AUR helper written in go.

→確認のコマンドを入力したら、注意喚起からか、ブラウザが起動して下記が開きました。
AUR (Arch User Repository)

→yay の次のバージョンがAUR で(多くの)テストがされていることがわかります。ある値まで行くと採用です。どちらにも「Installed」が書かれています。

こちらでもインストールの確認ができます:

$ pacman -Ss yay
:
community/yay 9.4.6-1 [インストール済み]
    Yet another yogurt. Pacman wrapper and AUR helper written in go.

$ yay --version
yay v9.4.6 - libalpm v12.0.1

マウス操作(GUI) で、リポジトリの更新

画面右下のパネルの「盾」アイコンをクリックで、「Pamac」マネージャが開きます。

もしくは、メニュー →システム管理 →「ソフトウェアの追加と削除」(pamac-manager)

「Pamac」マネージャで、右上の「3つの点」アイコンをクリック→「データベースをアップデートする」→パスワード入力 にて、リポジトリとデータベースを同期できます。

  • core
  • extra
  • community
  • multilib

Manjaro Hello でアプリのインストールと削除

初回のログイン時、もしくは、メニュー →システムツール →「Manjaro Hello」で「Manjaro へようこそ!」画面が起動できます。
welcome.jpg
→ライブ立ち上げだと、「インストーラーを起動」ボタンがあった位置が「Applications」ボタンになっています。ここから、定番のアプリのインストールができます。


カテゴリ分けされた、アプリの一覧から、オススメのアプリのインストールが可能です。左上の「advanced」をクリックすると、さらにアプリが増えます。

便利な「System Tools」をインストール

メニュー →システムツール →「Manjaro Hello 」→「Manjaro へようこそ!」画面
画面下の「Applications」をクリック→アプリの一覧画面が表示

左上の「advanced」をクリック
「System Tools」の左の▶をクリック

表示された一覧から、「IsoUSB」、「Mintstick」にチェックして、画面右上の「UPDATE SYSTEM」をクリック。
→パスワード入力→インストールされる一覧が表示→「適用」

  • 「USB イメージライタ」

メニュー→アクセサリ→「USB イメージライタ」
→ISO イメージをUSB メモリに展開できます。

  • 「USB メモリフォーマッタ」

メニュー→アクセサリ→「USB メモリフォーマッタ」
→USB メモリをフォーマット(Fat32、NTFS、Ext4)できます。全面初期化指定も可能です。USB メモリ限定なので、「ディスク」や「gparted」よりも安全です。


一覧にないアプリを探すとき

[Pamac] マネージャでManjaro リポジトリに登録されているアプリのインストールが可能です。

画面右下のパネルの「盾」アイコンをクリックで、「Pamac」マネージャが開きます。
もしくは、メニュー →その他 →「ソフトウェアの追加と削除」

カテゴリでの検索だけでなく、左上の虫眼鏡にて、アプリ名を入力しての検索ができます。


日本語入力(fcitx-mozc)のインストール

~/.xprofile を作成:

$ sudo gedit ~/.xprofile

下記の3行を追記:

export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export QT_IM_MODULE=fcitx

→ Fcitx のメモを見ると、~/.bashrc に書くのは、推奨されてないみたい。


fcitx-mozc のインストール

$ yay
$ yay -S fcitx-mozc
:
パッケージ (3) fcitx-4.2.9.7-1  zinnia-0.06-5  fcitx-mozc-2.23.2815.102-3

→依存で、fcitx、zinnia も一緒にインストールされます。手書き認識システムみたい。

$ yay -S fcitx-gtk2 fcitx-gtk3 fcitx-qt5 fcitx-configtool
:
パッケージ (4) fcitx-configtool-0.4.10-3  fcitx-gtk2-4.2.9.7-1  fcitx-gtk3-4.2.9.7-1  fcitx-qt5-1.2.4-3

→AUR にあるfcitx-qt4 でなく、公式リポジトリのfcitx-qt5 、および、fcitx の GUI の設定ツールを入れました。

ログアウト →ログイン

キーボードアイコンが表示され、半角/全角キー(または、Ctrl+スペース)で日本語オンになりました。


日本語フォントのインストール

日本語の指定でインストールすると、ほとんどの部分が日本語化されますが、一部のアプリでは、必要なフォントが違うのか、日本語を表示できないアプリがあります。

  • メニュー →その他 →「Manjaro Settings Manager」で項目名が消えていてアイコンしか表示されません。

システムトレイの「setteing-manager」の表示:
syoki-font-nasi.jpg
→項目が表示されません。

「setteing-manager」を起動したときの画面:
setteing-manager-01.jpg
→項目が表示されません。意味不明。

  • 追加インストールした「notepadqq」では、メニューから日本語が消えて歯抜けのメニューです。また、入力した日本語のテキストが表示されません。

→「noto-fonts-cjk」のインストールで解消しますが、サイズが大きいので「源ノ角ゴシック Code」をインストールしました。


「源ノ角ゴシック Code」のインストール

$ yay -S otf-source-han-code-jp
:
==> エラー: Cannot find the strip binary required for object file stripping.
Error downloading sources: otf-source-han-code-jp

→「strip binary が見つかりません」というエラーが出ました。検索すると「base-devel」パッケージのすべての再インストールが必要みたい。

参考:

Archlinux Solved: Cannot find the strip binary

「base-devel」パッケージのすべての再インストール
$ sudo pacman -S base-devel
[sudo] USER_NAME のパスワード:
:: 24 個のパッケージがグループ base-devel に存在します:
:: リポジトリ core
   1) autoconf  2) automake  3) binutils  4) bison  5) fakeroot  6) file  7) findutils  8) flex  9) gawk
   10) gcc  11) gettext  12) grep  13) groff  14) gzip  15) libtool  16) m4  17) make  18) pacman
   19) patch  20) pkgconf  21) sed  22) sudo  23) texinfo  24) which

選択して下さい (デフォルト=all):  →Enter

→すべてを選択しました。すでに入っており、すべて再インストールになりました。ただし、再インストールされたのが26個と表示されたので、一覧以外のパッケージもあったようです。新規インストールはなし。

「源ノ角ゴシック Code」のインストール
$ yay -S otf-source-han-code-jp
:
==> Packages to cleanBuild?
==> [N]one [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)
==> I
:
==> Diffs to show?
==> [N]one [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)
==> N

→実行できました。

インストールの確認:

$ yay -Ss otf-source-han-code-jp
aur/otf-source-han-code-jp 2.011-2 (+5 0.00%) (Installed)
    Japanese OpenType font for developers. Made by mixing SourceHanSans and SourceCodePro

表示の確認:
setting-manager-02.jpg
→項目名が表示されました。


notepadqq のインストール

Ubuntu で個人的によく使うテキストエディタです。使えるテーマが多いことと、開いていたタブ(ファイル)を起動時に開いてくれるのが利点。継続的な編集作業に便利です。

作業前に確認:
$ yay -Ss notepadqq
:
aur/notepadqq-git 2.0.0.beta.r5.g5553c0be-1 (+36 1.66%) 
    A Linux clone of Notepad++

community/notepadqq 1.4.8-2 (2.7 MiB 10.3 MiB) 
    Notepad++-like text editor for Linux

→公式リポジトリの「notepadqq」のバージョン(v1.4.8)は、不具合があります。

  • マウスの中央ボタンで貼り付けると、Ctrl+C で取り込んだ文字列が優先され、意図しない文字列が貼り付けられます。範囲指定のたびにCtrl+C が必要で操作が面倒です。

  • ヘルプ「?」→About Notepadqq... の「閉じる」ボタンが文字化け。

AUR の最新のnotepadqq をインストール

他のディストリビューションでアプリをビルドする場合、GitHub にあるビルド手順や注意を読んで、依存のあるライブラリとかツールを事前にインストールしておいて、ダウンロードしてビルドすることになります。

Arch Linx だとAUR とGit が連動しているというか、手続きを(アプリ開発者が)PKGBUILD スクリプトに書いているので、自動実行されます。バイナリのインストールと同じくらいに楽です。

$ yay -S notepadqq-git
:
[Repo: 6]  qt5-webchannel-5.14.1-1  qt5-location-5.14.1-1  snappy-1.1.8-1  minizip-1:1.2.11-4  re2-1:20200101-1  qt5-webengine-5.14.1-1
[Repo Make: 1]  qt5-tools-5.14.1-1
[Aur: 1]  notepadqq-git-2.0.0.beta.r5.g5553c0be-1

==> Remove make dependencies after install? [y/N] →Enter

:: Downloaded PKGBUILD (1/1): notepadqq-git
  1 notepadqq-git                            (Build Files Exist)
==> Diffs to show?
==> [N]one [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)
==> N

:: Parsing SRCINFO (1/1): notepadqq-git
[sudo] USER_NAME のパスワード:
:: インストールを行いますか? [Y/n] Y
:
Project ERROR: uchardet development package not found
make: *** [Makefile:48: sub-src-ui-make_first] エラー 3
==> エラー: build() で問題が発生しました。
    中止...
Error making: notepadqq-git

→「uchardet」開発パッケージがないみたい。(足りない依存パッケージは、PKGBUILD を見て yay が自動で追加してくれるはずですが…)。

ソース元の、AUR notepadqq-git 2.0.0.beta.r5.g5553c0be-1を開き、コメントを見ていくと、

jakyote commented on 2019-09-25 05:22 のコメントに、修正後のPKGBUILD スクリプトが書かれています。
→PKGBUILD の記述が不足していて、追加のインストールが必要みたい。


依存パッケージの不足分を追加インストール:

メニュー →その他 →「ソフトウェアの追加と削除」
下記を検索してインストール

  • uchardet (0.0.6-2)
  • qt5-websockets (5.14.1-1)

notepadqq をインストール:
$ yay -S notepadqq-git
:
==> Packages to cleanBuild?
==> [N]one [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)
==> I

==> Diffs to show?
==> [N]one [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)
==> N
:
[sudo] USER_NAME のパスワード:
インストールされたかの確認:
$ yay -Ss notepadqq
:
aur/notepadqq-git 2.0.0.beta.r5.g5553c0be-1 (+35 0.96%) (Installed)
    A Linux clone of Notepad++

community/notepadqq 1.4.8-2 (2.7 MiB 10.3 MiB) 
    Notepad++-like text editor for Linux
起動コマンドは notepadqq で良いみたい:
$ notepadqq --version
qt5ct: using qt5ct plugin
Notepadqq 2.0.0-beta+git

動作確認:

メニュー →アクセサリ →「Notepadqq Source Code Editor」

notepadqq-new.jpg

「?」 →「Notepadqq について」→「v2.0.0-beta+git」と表示。

→「閉じる」ボタンがちゃんと表示されます。
メニュー の日本語化が完了しています。

マウスの中央ボタンが範囲指定した文字列の貼り付けになっています。Ctrl+C とは、別に動作します。正常になりました。

→テーマは「twilight」または、「monokai」を使っています。


KolourPaint のインストール

メニュー →その他 →「ソフトウェアの追加と削除」(pamac-manager)
左上の虫メガネで検索して→「インストール」→「適用」→パスワード入力 →「適用」

サイトにスクリーンショットの画像をアップするときの加工に使っています。画像ファイルを右クリックして起動することが多いです。


ファイアウォールの設定

インストールの確認:

$ yay -Ss gufw
:
community/gufw 19.10.0-2 (908.2 KiB 3.1 MiB) (Installed)
    Uncomplicated way to manage your Linux firewall

→インストールされていますが、メインメニューにありません。

$ sudo gedit /usr/share/applications/gufw.desktop

内容の修正:

Categories=GNOME;GTK;Settings;Security;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;

↓ コメントにしてから修正:

# Categories=GNOME;GTK;Settings;Security;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
Categories=GNOME;System;

ログアウト→ログイン

メニュー →システムツール →「ファイアウォール設定ツール」→パスワード入力

Status: オン→「盾」アイコンがカラーになれば稼働。


パネルの時計のカスタマイズ

メニュー →システムツール →「Budgie デスクトップの設定」→上パネル→「アプレット」タブ

「Clock」を選択→「設定がありません」

パネルの時計を左クリック→設定
時計の書式は、日付のあり・なしか、24時間制かを選べるくらいです。

曜日も表示したいときは、「Clock」をやめて、「ShowTime」を追加して、デスクトップに時計を表示させることもできます。「ShowTime」は追加したときの「中央」のままでOK です。

ちなみに、カレンダーは、時計の右にある「矢印」アイコンをクリックすると見れます。


パネルを下に移動

パネルを使い慣れた「下」に移動しました。

メニュー →システムツール →「Budgie デスクトップの設定」→上パネル →「設定」タブ

位置: 上 →「下」に変更


パネルのシステムトレイでアイコンが重なる不具合

ちなみに、Budgie には、パネルのシステムトレイでアイコンが重なる不具合があります。Manjaro Budgie でも発生しているようです。(下記だと、キーボードアイコンが複数表示されています。)

fuguai-01.jpg
→パネル位置を下→上→下と戻すと、(ログアウトするまで)解消できます。気にしなければ支障はありません。


ウィンドウ画面のタイル表示の使い方

ウィンドウを選択して、アクティブにします。
Windows + 「←」: 1/2 画面で左に移動
Windows + 「→」: 1/2 画面で右に移動

タイトルバーをつかんで 左右にぶつけてもOK 。上にぶつけると最大化です。
ちなみに、ウィンドウのタイトルバーをダブルクリックしても最大化して、再びダブルクリックすると元にもどります。


デスクトップ画面、およびログイン画面の壁紙の変更

デスクトップで右クリック→「壁紙の変更」→「設定」の「背景」タブが開きます。

一番上が現在の設定で、左が「デスクトップ画面」の壁紙、右が「ログイン画面」の壁紙です。

好みの画像を左クリック→「背景に設定」、「ロック画面に設定」、「背景とロック画面に設定」から選べます。

画像を追加したいときは、画面上にある「写真の追加…」をクリック。
ファイルマネージャで開くので、画像を選択して、「開く」で追加されます。


パネルにアプリを追加

好みのアプリ、例えば、「Gedit」、「Notepadqq」を起動します。
パネルに表示されたアイコンを右クリック→左下の☆をクリック→★に変わります。→アプリがパネル(の「Icon Task List」)に登録されました。(もう一度行うと、解除)


パネルの「ロケットランチャー」にアプリを追加

メニュー →システムツール →「Budgie デスクトップの設定」→下パネル→「アプレット」タブ
→アプレットの追加→「App Launcher」→「アプレットの追加」

作られた「App Launcher」を選択→「↑」で「Icon Task List」の下に移動
→閉じます。

パネルにできた「ロケット」アイコンを左クリック→ダイアログの右上の「鉛筆」クリック
アプリの一覧から下記にチェック→「Apply」にて保存。矢印キーで上下の移動が可能です。

  • ソフトウェアの追加と削除
  • ディスク
  • USB メモリフォーマッタ
  • Budgie デスクトップの設定
  • スクリーンショット
  • カレンダー

すべての設定後の画面:

99.jpg
→シンプルです。右は「gedit」をWindows+「→」でタイル表示させているところです。マス目を表示しています。パネルを下に設定したので、デスクトップ環境が何だったか、忘れてしまいそうです。


気になるところ

  • メインメニューのカテゴリ分けで「その他」に入っているアプリが多いです。

  • 「ファイアウォール設定ツール」はメニューに登録されていません。

  • パネルの時計からカレンダーが呼び出せるのですが、カレンダーではなく「gedit」が起動されます。ちなみに、カレンダーは、時計の右にある「矢印」アイコンをクリックすると見れます。


あとがき

デスクトップ環境としての「Budgie」は癖がなく使いやすいです。
Ubuntu Budgie と比べた場合、どちらかというと、Manjaro はクールな印象です。

コミュニティ版なのでManjaro のサポート対象外ですが、それほど心配は要りません。シンプルでクールで、安定しています。インストールするUSB メモリの性能によりますが、それほど重くありません。

基本は、Arch Linux なので、問題があっても、今までの他のフレーバーとかの経験とか、ネット検索が役に立ちました。
AUR リポジトリが使えるので、最新のアプリを簡単に試すこともできます。それは大きな利点です。

(次の投稿に続く)


今までの投稿一覧は 「ここ

-

Raspbian初期設定(RaspberryPi4)

$
0
0

前回の続き『RaspberryPi4購入』
Raspbian:10.3
kernel:4.19.97-v7l+ #1294

1. RasbianOS初期設定

NOOBSでOSインストール時にwifi設定を実施していると、OSにもその設定がされた状態でインストールされていました。

1.1. rootのパスワードを設定する

初期状態のラズベリーパイは、「root」にパスワードが設定されていません。

$ sudo passwd root
$ su -

1.2.RasbianOSを最新の状態にする。

$ rpi-update
$ reboot

1.3. 次に、SSHの有効化

$ mkdir /boot/ssh
$ shutdown -r now

1.4. SSHでログイン

SSHにてユーザ pi初期パスワード raspberryで接続

1.5. ログイン用ユーザーを追加

$ useradd  --group sudo -m -u <uid> <newuser>

1.6. ログイン用ユーザーのパスワード変更

$ passwd <newuser>

1.7. piユーザの削除

userdel -r pi

1.8. IPアドレス固定化

$ vi /etc/dhcpcd.conf

interface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.1

interface wlan0
static ip_address=192.168.1.30/24
static routers=192.168.1.1

1.9. SSH設定

セキュリティ向上のため、ポートを変更しrootでの直接ログインを拒否し、暗号化キーを有効化し、パスワード認証を無効化し、セッション有効時間を延長しています。※変更箇所のみ記載しております。

$ vi /etc/ssh/sshd_config

Port <PortNo>
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication no
ClientAliveInterval 1800
ClientAliveCountMax 3

1.10 暗号化キーの作成

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/<username>/.ssh/id_rsa):
Created directory '/home/<username>/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/<username>/.ssh/id_rsa.
Your public key has been saved in /home/<username>/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:*************************************************** <username>@raspberrypi
The key's randomart image is:
+---[RSA 2048]----+
|OOOOOO           |
+----[SHA256]-----+
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

1.11. IPアドレス固定化(無線LAN)

まずは、無線LANアクセスポイントを設定(アクセスポイントが複数ある場合)

$ vi /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="<SSID1>"
        psk="<passphrase>"
}

network={
        ssid="<SSID2>"
        psk="<passphrase>"
}

次に無線LAN I/FにIPアドレスを定義しますが、アクセスポイント毎に割り当てIPアドレスを定義することができます。

$ vi /etc/dhcpcd.conf
interface wlan0
ssid <SSID1>
static ip_address=192.168.1.30/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

ssid <SSID2>
static ip_address=192.168.11.30/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

1.12. パッケージとOSの更新

$ apt update
$ apt upgrade
※upgrade実行時、保留が出たら以下を実施すること
$ apt -s dist-upgrade
$ apt upgrade

1.13. ファームウェアの更新

$ rpi-update  
$ reboot

1.14. 自動upgrede

aptコマンドで手動でupgradeするのは面倒なので、自動更新するパッケージを導入。

$ apt install -y unattended-upgrades
$ vi /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Origins-Pattern {
        "o=${distro_id},n=${distro_codename}";

※Unattended-Upgradeの次の行に "o=${distro_id},n=${distro_codename}";を追記する。

1.15. sudoers(piユーザ用)の削除

piユーザを削除しているので、問題はないと思うが念のためsudoers定義を削除

$ rm /etc/sudoers.d/010_pi-nopasswd

1.16. Timezone設定

$ raspi-config

4 Localisation Optionsを選択し、
I2 Change Timezoneを選択。
アジアを選択。
東京を選択。
了解を選択。

1.17. NTP設定

$ timedatectl status
               Local time: 土 2020-03-21 14:35:07 JST
           Universal time: 土 2020-03-21 05:35:07 UTC
                 RTC time: n/a
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

NTP serviceactiveとなっていれば、NTPサービスは起動状態なので自動起動設定はあえてやる必要はありません。

$ vi /etc/systemd/timesyncd.conf
[Time]
NTP=ntp.jst.mfeed.ad.jp
FallbackNTP=ntp.nict.jp time.google.com

1.18. Wifi接続元国設定

$ raspi-config

4 Localisation Optionsを選択し、
I4 Change Wi-fi Countryを選択。
JP Japanを選択。
了解を選択。

1.19. NTFSインストール

$ apt -y install ntfs-3g

※Raspbian Lite10.3では既に入ってました。

1.20. USBディスクの追加

USBディスクを接続し、USB HDDのUUIDを調べます。

$ blkid
/dev/mmcblk0p1: LABEL_FATBOOT="RECOVERY" LABEL="RECOVERY" UUID="BED1-E8B9" TYPE="vfat" PARTUUID="00031adc-01"
/dev/mmcblk0p5: LABEL="SETTINGS" UUID="f3286ddd-6b11-4a1e-b780-32c39134818d" TYPE="ext4" PARTUUID="00031adc-05"
/dev/mmcblk0p6: LABEL_FATBOOT="boot" LABEL="boot" UUID="3CB5-EC8B" TYPE="vfat" PARTUUID="00031adc-06"
/dev/mmcblk0p7: LABEL="root" UUID="f319c423-f87b-4a99-8309-11173614c408" TYPE="ext4" PARTUUID="00031adc-07"
/dev/mmcblk0: PTUUID="00031adc" PTTYPE="dos"
/dev/sda1: LABEL="My Passport" UUID="C00EE4C60EE4B716" TYPE="ntfs" PTTYPE="atari" PARTLABEL="My Passport" PARTUUID="4638ed1e-9915-42f4-96b5-1491ff482e58"

自動マウントするため fstabに追記

$ mkdir /data
$ vi /etc/fstab
UUID="C00EE4C60EE4B716"    /data    ntfs-3g      async,auto,dev,exec,gid=65534,rw,uid=65534,umask=000    0    0

【Python】データ分析、機械学習実践(Kaggle)〜モデル解析編〜

$
0
0

はじめに

前回の記事
【Python】初めての データ分析・機械学習(Kaggle)

【Python】初めての データ分析・機械学習(Kaggle)〜Part2〜
に引き続き、Kaggleで比較的優しいコンペ「House Prices: Advanced Regression Techniques」に挑戦しました!

今回のコンペは、住宅に関する情報の変数をもとに、住宅の価格を推定するというもの。
しかし、この住宅に関する変数が80もあり、いきなり怖気付きました、、(笑)

「こんなのできるのか、、?」て思いつつ、今回もしっかり先人の知恵を借りました!笑
参考コード↓↓↓

大まかな流れは、以下のようになっています。

  1. 特徴エンジニアリング
    1. Imputing missing values欠損値の穴埋め
    2. Transformingデータ変換(log変換等)
    3. Label Encodingカテゴリカルデータのエンコード
    4. Box Cox Transformation : 正規分布に近づけさせるための変換
    5. Getting dummy variablesカテゴリカルデータを数値データへ
  2. モデリング(スタッキングアンサンブル学習)
    1. ベースモデル解析
    2. 第2モデル解析

そして、本記事では、 モデリングに焦点を当てていきます!
ですから、Kaggleのコンペの予測値まで出力するところまで行きます!!

前回の特徴エンジニアリングに関する記事はこちら↓↓↓
【Python】データ分析、機械学習実践(Kaggle)〜データ前処理編〜

1. ライブラリのインポート

今回もTitanicの時と同様にスタッキングアンサンブル学習で予測する。

使用するモデル
1. LASSO Regression
2. Elastic Net Regression
3. Kernel Ridge Regression
4. Gradient Boosting Regression
5. XGBoost
6. LightGBM

学習の流れ

  1. 4つのモデルを平均する

    1. LASSO Regression
    2. Elastic Net Regression
    3. Kernel Ridge Regression
    4. Gradient Boosting Regression
  2. 1.で平均したモデルXGBoostLightGBMの3つでスタックして最終的な予測を行う

スクリーンショット 2020-03-20 10.45.26.png

fromsklearn.linear_modelimportElasticNet,Lasso,BayesianRidge,LassoLarsICfromsklearn.ensembleimportRandomForestRegressor,GradientBoostingRegressorfromsklearn.kernel_ridgeimportKernelRidgefromsklearn.pipelineimportmake_pipelinefromsklearn.preprocessingimportRobustScalerfromsklearn.baseimportBaseEstimator,TransformerMixin,RegressorMixin,clonefromsklearn.model_selectionimportKFold,cross_val_score,train_test_splitfromsklearn.metricsimportmean_squared_errorimportxgboostasxgbimportlightgbmaslgb

2. 交差検証の定義

k=5(データ群を5分割)として
モデルの評価は対数平均二乗誤差(RMSLE)で行います。
スコアが小さいほど精度が高いという見方です!

#Validation function
n_folds=5defrmsle_cv(model):kf=KFold(n_folds,shuffle=True,random_state=42).get_n_splits(train.values)#シャッフル
rmse=np.sqrt(-cross_val_score(model,train.values,y_train,scoring="neg_mean_squared_error",cv=kf))return(rmse)defrmsle(y,y_pred):returnnp.sqrt(mean_squared_error(y,y_pred))

3.平均するモデリング

  1. 4つのモデルの平均(ベースモデルEnet・KRR・Gboost,メタモデル=lasso)
  2. XGBoost
  3. LightGBM

この3つをスタッキングします!

まずは、1. 4つのモデルの平均(ベースモデルEnet・KRR・Gboost,メタモデル=lasso)から!

classStackingAveragedModels(BaseEstimator,RegressorMixin,TransformerMixin):def__init__(self,base_models,meta_model,n_folds=5):self.base_models=base_modelsself.meta_model=meta_modelself.n_folds=n_folds# モデルのクローンにデータをfitさせる
deffit(self,X,y):self.base_models_=[list()forxinself.base_models]self.meta_model_=clone(self.meta_model)kfold=KFold(n_splits=self.n_folds,shuffle=True,random_state=156)# 学習ベースモデルがフォールド外予測をします
# そのフォールド外予測はメタモデルで必要となります
out_of_fold_predictions=np.zeros((X.shape[0],len(self.base_models)))fori,modelinenumerate(self.base_models):fortrain_index,holdout_indexinkfold.split(X,y):instance=clone(model)self.base_models_[i].append(instance)instance.fit(X[train_index],y[train_index])y_pred=instance.predict(X[holdout_index])out_of_fold_predictions[holdout_index,i]=y_pred# フォールド外予測を用いてメタモデルの学習
self.meta_model_.fit(out_of_fold_predictions,y)returnself#全てのベースモデルの予測値と予測の平均値をメタ特徴として、メタモデルで最終予測を行います!
defpredict(self,X):meta_features=np.column_stack([np.column_stack([model.predict(X)formodelinbase_models]).mean(axis=1)forbase_modelsinself.base_models_])returnself.meta_model_.predict(meta_features)

ベースモデルEnet・KRR・Gboost,メタモデル=lassoで適応します。

stacked_averaged_models=StackingAveragedModels(base_models=(ENet,GBoost,KRR),meta_model=lasso)score=rmsle_cv(stacked_averaged_models)print("Stacking Averaged models score: {:.4f} ({:.4f})".format(score.mean(),score.std()))
出力
Stacking Averaged models score: 0.1085 (0.0074)

平均したモデルをrmsle()で評価します!

stacked_averaged_models.fit(train.values,y_train)stacked_train_pred=stacked_averaged_models.predict(train.values)stacked_pred=np.expm1(stacked_averaged_models.predict(test.values))print(rmsle(y_train,stacked_train_pred))
出力
0.0781571937916

4. 平均しないモデリング

平均しないXGBoostLightGBMのモデルで学習・テスト・評価します!

XGBoost

#学習
model_xgb.fit(train,y_train)xgb_train_pred=model_xgb.predict(train)#テスト
xgb_pred=np.expm1(model_xgb.predict(test))#評価
print(rmsle(y_train,xgb_train_pred))
出力
0.0785165142425

LightGBM

model_lgb.fit(train,y_train)lgb_train_pred=model_lgb.predict(train)lgb_pred=np.expm1(model_lgb.predict(test.values))print(rmsle(y_train,lgb_train_pred))
出力
0.0716757468834

5. 平均モデルとXGBoostとLightGBMをスタッキング

'''RMSE on the entire Train data when averaging'''print('RMSLE score on train data:')print(rmsle(y_train,stacked_train_pred*0.70+xgb_train_pred*0.15+lgb_train_pred*0.15))
出力
RMSLE score on train data:
0.0752190464543

アンサンブル学習

ensemble=stacked_pred*0.70+xgb_pred*0.15+lgb_pred*0.15

6. Kaggleの提出

sub=pd.DataFrame()sub['Id']=test_IDsub['SalePrice']=ensemblesub.to_csv('submission.csv',index=False)

最後に

今回参考にしたStacked Regressions : Top 4% on LeaderBoardでは、説得力を増すための補足的なコーディングが多かったので、本記事ではかなりシンプルに書きました!

ただし、人のコードを参考にしただけなので、自分でもまだ消化し切れていない部分があります、、
例えば、

  • 各モデルの利用根拠
  • 最後にスタッキングする際に、重みを「0.7,0.15,0.15」にした理由

などがよくわかっていませんので、もしもわかる方がいらっしゃいましたらコメントで教えていただきたいです😣

おかしな記述があるかもしれませんが、少しでもモデリングについて参考になれば幸いです!!

Progate  HTML&CSS編

$
0
0

ProgateのHTML&CSSを終えたので少し感想を書こうと思います。

やった感想として、中級の道場コースが一番大変だった。
学習コースの初級と中級をやっていくとそれ以外は、だんだんHTMLとCSSなれていって、上級の内容とかはかなり簡単と感じるようになります。

次は、Rubyを触っていく予定です。

製薬企業研究者がGitの基本についてまとめてみた

$
0
0

はじめに

Gitは共同開発で使われるバージョン管理ツールです。
ファイルの変更履歴を管理することができます。
ここでは、Gitの基本に絞って解説します。

Gitの初期化

Gitを使うときは最初に準備として以下のコマンドを実行します。

$ git init

これによりGitが初期化されます。

リモートの登録

これからファイルをアップロードするリモートの場所を登録するには以下のコマンドを実行します。
リモート名としては、originを使うことが多いです。

$ git remote add リモート名 リモートのURL

ファイルの選択

アップロードするファイルを選択するには、以下のコマンドを実行します。

$ git add ファイル名

コミット

選択したファイルをコミットするには、以下のコマンドを実行します。

$ git commit -m"コミットメッセージ"

リモートへのファイルのアップロード

コミットしたファイルをアップロード(プッシュ)するには、以下のコマンドを実行します。
ブランチ名は、masterとすることが多いです。

$ git push リモート名 ブランチ名

リモートからのファイルのダウンロード

リモートからファイルをダウンロード(プル)するには、以下のコマンドを実行します。

$ git pull リモート名 ブランチ名

変更の確認方法

追加されたファイルや、変更が加えられたファイルを確認するには、以下のコマンドを実行します。

$ git status

変更内容の詳細を確認するには、以下のコマンドを実行します。

$ git diff

コミット履歴の確認方法

コミットの履歴や、コミットメッセージを確認するには、以下のコマンドを実行します。

$ git log

まとめ

ここでは、Gitの基本的な使用方法について解説しました。
共同開発だけでなく、個人でファイルの変更履歴を把握するときにも使えます。

LoadError, Unable to autoload constant ~

$
0
0

本記事投稿のいきさつ

railsでアプリ作成をしていたところLoadErrorが発生し基礎知識がなかったためにハマったため忘れないように、書き残します。
また、同じエラーで困っている初心者のためになれば幸いです。

エラー発生

itemモデルとitem_imageモデルでアソシエーションを組み,以下の記述をしたところエラーが発生

items_controller.rb
defnew@item=Item.new@item_images=Item_image.newend

エラー表示は以下です。

LoadError in ItemsController#new
Unable to autoload constant Item_image, expected *****/models/item_image.rb to define it

解決まで

なるほど。アソシエーションの記入を間違えたのか。
と初学者の自分は考えitem_image.rbを確認します。
item_image.rbの記述は以下です。

item_image.rb
classItemImage<ApplicationRecordbelongs_to:itemend

あれ?ちゃんと書けている。
と初学者の自分は思いました。自分の仮説が外れたので、Google先生に聞いてみました。

解決

Googleで調べたところどうやら

モデル名にアンダーバーを使ってもクラス名にアンダーバーはつかないとのことです。

ということでitems_controller.rbを編集。

items_controller.rb
defnew@item=Item.new@item_images=ItemImage.newend

無事解決することができました。
とても基本的なことですが、今までモデル名にアンダーバーを使っていなかったため、気づくこと出来なかった自分にとってはいい経験になりました。

おわり

最後まで見ていただき、ありがとうございました。


Pythonで毎日AtCoder #12

$
0
0

はじめに

前回
今日はAGCがあるから書かなくていいかなと思っていたら、一問も解けなかったので書きます。最近はAGC-Aとかもレコメンドに出てくるので疲れる。

#12

問題
1WA。参加したけど解けなかった問題

考えたこと
まず考えるのは$B-A$が偶数のときで、偶数のときは$\frac{B-A}{2}$でよい。問題は、$B-A$が奇数のとき。$B-A$が奇数のときはどれだけ近くなっても同卓できることはない。なのでどちらかが1またはNに行って偶奇を調整しなければならない。当然、1、Nに近い方がそれぞれに行った方が同卓するまでの回数は減るので$min(a-1,n-b)$でどちらが近いかを求める。a-1しているのは、卓の数字は1から始まっているから。1、Nまで行くと偶奇を調整するために+1、$B-A-1$が偶数になったので$\frac{B-A-1}{2}$すればよい。

n,a,b=map(int,input().split())d=b-aifd%2==0:print(d//2)else:print(min(a-1,n-b)+1+(b-a-1)//2)

ifで偶奇の判断をして、後は上に書いた通りに計算している。

まとめ

AGC-Aは難しい。明日のABCは取り敢えずA~Cの三完を目指す!!
では、また。おやすみなさい。

駆け出しエンジニアが知識ゼロから1ヶ月半でAWSのSAA試験に受かった話

$
0
0

1ヶ月半の学習を経て、AWSソリューションアーキテクトアソシエイト試験に合格したので学習方法等を記録しようと思います。
僕のような駆け出しの方でAWS-SAA受けようという方の参考になればと思います。

前提

  • SES
  • 実務経験は4.5ヶ月程度(学習開始時は3ヶ月程度)
  • 現在の職場が初現場、初プロジェクト
  • 普段はLaravelやReactを触らせてもらってる
  • スキル的にはフロント寄り
  • ネットワーク知識はほぼなし
  • オンプレミスのインフラの知識もほぼなし
  • もちろんその辺の実務経験もなし

受験までの経緯

現在のプロジェクトのメンバーの方でフロント技術を得意としている方がおりまして、普段はその方からReactを教えてもらっています。その方との会話の中で「ネットワークやインフラの知識も大事だよねー、最近だとクラウドだよねー」といった感じになり、気づいたら一緒に1ヶ月後の試験を予約していました。

自分としても徐々にフロント周りの知識がついてきていたので、きっかけがあれば他のことも勉強したいなと思っていました。
勉強始める前に試験を申し込んでしまうのは絶対に必要かなと思います。じゃないと結局やらないので。

主に使用した教材

あとは公式サイトやGoogleです。

試験のためにやったこと

  1. はじめにUdemyの動画講座を購入し、動画を視聴。
  2. 丁寧な解説で理解しやすいが、僕自身の前提知識がなさすぎてイマイチ頭に残っていないことに気づき、効率が悪いと判断
  3. このタイミングでKindleで参考書の購入、Udemyの動画視聴を一旦やめる。
  4. わからない言葉はGoogleで調べながら、参考書を一通り読む。
  5. 試験が近くなってきたので、Udemy模擬試験を解いて、気になるところを動画や書籍や公式サイトで見直す。

基本は土日に時間をとって勉強して、平日は通勤時間などにスマホでKindleみたり、模擬試験の解説をみていました。
職場でも昼休みに経験豊富な上司にネットワーク関連の話を質問したりして前提知識を増やしていきました。

Udemyの動画講座は他の方の記事にも紹介されており、おすすめです。
ただ、全くの初心者の場合、個人的には先に書籍などで自分のペースで言葉などを調べながらやる方がいいかなと思います。
書籍の場合、概要をつかむのにおすすめですが、情報が古いことがあるので注意です。

この段階では22時間あるUdemyの動画は全部は見れず、心残りはあったがそのままの日程で試験を受けました。

初受験スコア

SAA試験は1000点満点の試験です。合格ラインは720点で7割程度の正答率が求められます。問題数は65問、選択式です。

結果は700点で不合格
後日スコアレポートをみると、セキュリティの問題が弱かったみたいでした。
一発で合格したかったのですが、自分で購入した分の教材すら全てみれていなかったので仕方ないかなという風にも思いました。

再び試験が受けられるのは二週間後になりますので、そこでリベンジしようと思いました。期間が空くと勉強しないので。

反省点

  • 単純に勉強時間が少なかった。
  • ハンズオンをやっていなかったため、細かい設定や各サービスのデフォルト設定などが全くわかっていなかった。
  • ネットワークの基礎知識が全然なかったので、問題文自体がすっと入ってこなかった。
  • 各サービスでできることの範囲や切り分けが曖昧だった。
  • 切り分けが曖昧なので各サービスの連携に関わる問題で迷ってしまった。

再受験までにやったこと

  1. ネットワークの基礎知識を習得するためマスタリングTCP/IP入門編を購入し読んでみた。読み物として気楽に読めるのでおすすめ。
  2. 視聴できていなかったUdemy動画を見て、ハンズオンの動画もしっかり見た。(この時には動画の内容も以前より理解しやすくなっていたので1.5倍速でも無理なく学べました)
  3. 自分のawsアカウントでコンソール画面を触って見たりした。
  4. 模擬試験問題を解いて、復習を繰り返した。

誘惑に負けてNetflixで鬼滅の刃と約束のネバーランドを全部見てしまったりしましたが、一度試験を受けてイメージが出来ていたので前回よりは気持ちに余裕がありました。試験直前では結局緊張したんですけどね。

再受験スコア

結果は755点で合格。ギリギリでした。
回答終了後すぐに結果出るのは心臓に悪いです。
でも結構嬉しかったです。資格を取ったことなかったので。

後日レポートではまたしてもセキュリティの問題が弱かったみたいでした。
サブネット構成、証明書やデータ暗号化周りの復習は必要そうです。

よかったこと

  • 少し自信がついたこと
  • ネットワークやインフラの基礎知識を学べたこと(まだまだこれからだとも思います)
  • 学習を通してフロントエンド以外の技術に対する興味関心が生まれたこと

まとめ

学習方法に関しては僕みたいな初心者は本を読むのがおすすめです。そこから動画や公式サイトを見て行くのがいいと思います。
ある程度経験や知識のある方はUdemyの動画だけでも良い気がします。
Udemy模擬試験と解答解説をしっかりみるのはマストだと思います。
コンソール画面も一度触ったり動画でしっかりみるとイメージ湧きやすくなります。図やイメージは大事です。

感想としては実務で触るのがきっと1番勉強になるんだろうなと思いました。
個人的にはこの試験だけでは実務でバリバリというのは難しそうな気もします。
ですが知識は絶対に得られるし、学習のきっかけ、AWSなどのクラウドを使った仕事をするきっかけにはなってくれるかもしれませんし、駆け出しの方にとっては多少のアピールにはなるのかなとも思ったりしています。

これをとっかかりとして今後も継続的な学習を心がけたいと思います。

以上。

switch文

$
0
0

はじめに

switch文とは、
条件分岐を行う際の、
方法の1つです。

※もう1つは、if文です。

switch文

まずは、記述例をご覧下さい↓↓

switch(変数){caseA:(変数が値Aの場合の処理);break;caseB:(変数が値Bの場合の処理);break; ・・・・default;(変数がどの値にも合致しない場合)}

上記の記述方法により、
複数の条件分岐を定義することができます。

内容といたしまして...

「変数が値Aの場合に処理AAを行う」
「変数が値Bの場合に処理BBを行う」
このようになっております。

1番下に記述してあります、
「default」 はどの条件にも合致しない場合を表します。
if文でいう「else」のような役割です。

JavaScriptのswitch文では、上から順に変数の値を比較していき、合致した時点で該当する処理が行われます。
ここまでは、if文と同じです。
しかし、これからが違う処理内容となっており、
それ以降に記載された処理もすべて実行されてしまうのです。

記述例を見ていきましょう↓↓

varnumber=3;switch(number){case1:document.write("1");case2:document.write("2");case3:document.write("3");case4:document.write("4");}//34

このように、変数は3ですが、
「34」と表記されてしまっています。

理由として、

最初の記述例と、見比べると分かりますが、
「break」が記載されていません。

「break」は、処理を抜ける要素を持っています。
使用しないことにより、
それ以降の内容も処理されてしまいます。

※「break」を意図的に記述しないやり方もありますが、
一般的には、使用されています。

まとめ

breakを使用しないと、
処理回数が複数になってしまう可能性が
出てくる。

if文との使い分けは以下の通り。
二分岐→if文
多分岐→switch文

理由は、分岐が3つ以上になってしまうと、
if文だと、文が読みにくくなってしまう。
なので、上記のような使い分けをお勧めします。

本日もありがとうございました。

最速Svelteを速攻デプロイするなら、Zeit NOW一択というメモ。

$
0
0

Svelteで何かデプロイしたい時には。

普段、バックエンドに引きこもっているデータエンジニアだが、たまにはフロントエンドに出ていってみようかと思い、最速JSに近しい存在という爆速(=>死語?)なSvelteいじって三日目。そろそろ(無料で)デプロイなるものをしてみたい今日このごろ。

...ということで、nodejs系を始めいろいろと無料でお気楽にデプロイできそうなZeit NOWを試してみた。
参考 Now でクラウドの複雑さから解放されよう、今すぐに

github(かgitlabなど)の個人アカウントを持っているならば、たしかに、すぐさまデプロイできたのでメモを残しておく。Zeit now初体験だったが、10分ほどでデプロイをできた。

デプロイしたもの(カス):
sve.PNG
アクセス先:
https://svelte1.now.sh

・・・デプロイしたものは、Svelteの公式チュートリアルの一部を改悪しただけのカス。

SvelteをNOWにデプロイする手法(2020年版)

① NOW用Svelteをfolk

『zeit svelte』でググると出てくる以下から、
https://zeit.co/guides/deploying-svelte-with-zeit-now
自分が使っているgitリポジトリのアカウントを選ぶだけ。githubの場合
https://zeit.co/import/git?tab=github
あとは、SSOの認証を行うとディフォルトでprivateリポジトリにfolkしてくれる。
公開すると恥ずかしいサービスを作りたいとか、一山当てたいサービスを作りたい際には、privateリポジトリがディフォルトなのはありがたい限り。

② NOW用Svelteをcloneして編集

folkたら当然、git cloneの類を持ってきて編集することになる。
フォルダ構成は以下の通り。ほぼSvelteのフォルダ構成通りだが.nowフォルダ配下がZeit NOWとの周りの調整を担ってくれているらしい。

sv.PNG

とりあえず、お試ししたい場合は、↑のApp.svelteを編集する。今回の場合。

<script>letcount=1$:doubled=count*2$:tripled=count*3lethandleClick=()=>{count=tripled+3}</script>
<style>p{color:purple;font-family:'Comic Sans MS',cursive;font-size:2em;}</style>
<main><h1>滑る手おぢさん(仮)。</h1>
<h2><ahref="https://zeit.co/docs"target="_blank"rel="noreferrer noopener">ZEITNow</a>
Svelteしてみる。突然だが、おい、オマイラ、掛け算という奴をしてみないか。すごく大きくなるぞ。</h2>
<br/><p>元の数{count}しかして、け奴の×2は、{doubled}然らば、×3{tripled}。けだし大きな数なり。</p>
<buttonon:click={handleClick}>クリックしてみて只今の元の数:{count}</button>
</main>

③ デプロイ

node/npm入っている人ならば、ひとまず、npm i -g nowした後に、メール認証などを済ませた後は、
編集しているフォルダにて、
now --prod
するだけで、git add/git commit / git push、そしてNOWを介して本番デプロイという手順を一気に済ませられる。
セキュリティ云々を考えないなら、ほんとにお気軽。

終わりに

少なくとも個人開発でのnodejsでの開発工程ならば、Zeit NOWは現時点では文句なしの存在ということを確認した。Svelteのバックエンドは数十分で始めた、Svelte+Firebaseのアプリ生活。で、firebaseが良さげと分かっている。
フロントエンド素人として悩ましいのが、node上でSvelteを動かす方法。絶賛開発中のSapperを試してはみたが、(英語でも)文書がなさすぎて素人にはつらすぎる(セキュリティ云々を気にするとfirebaseをバックエンドにしたアプリを公開できるは先になりそう、、)。

どなたかSvelte/Sapperのベストプラクティスを紹介してくださらぬものかのぅ.(コーダー老人的堕ち)。とりあえず、Svelteお試しする分には楽しいので良しとするが。

初心者から始めるJava、インターフェイス

$
0
0

はじめに

この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
間違えたものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

環境

言語:Java11、JDK13.0.2
動作環境:Windows10

インターフェイス

前回扱った抽象クラスと似た使い方をする、インターフェイスという機構がある。抽象クラスはクラスの一種だった、インターフェイスも似た目的で作られるがその宣言・実装方法は異なる。

declareInterface.java
interfaceFelidae{Stringtype=cats;voidmeetsCats();}

いつものclass宣言がなくなり、代わりにinterfaceになっている。クラス同様、フィールドとメソッドを持つことが出来る(コンストラクタを持つことはできない)が、
Felidae cat=new Felidae();のようなオブジェクトの生成はできない。またvoid meetsCats()は抽象メソッドのため、Felidaeインターフェイスを実装したクラスによってその具象メソッドを用意する必要がある(オーバーライド)。

String type = cats;はインターフェイスのフィールドだが、これは定数であり変更が効かない。インターフェイスのフィールドには、public static finalがついていることと同じ状態であるためだ(なぜそうなっているか僕はまだ分かっていない)。

inplementedFlidae.java
classHousecatinplementsFelidae{voidmeetsCats(){System.out.println("猫を発見したよ。多分どこかのイエネコだと思う。");}}

拡張のextendsではなく代わりにimplementsになっているが、形としては今までと変わりない。

原則:スーパークラスはひとつだけ

なぜ抽象メソッド・インターフェイスが必要になるのか。すべてクラス拡張で済ませればいいと思うのだが、Javaは複数のクラスによる多重継承を認めていない。親であるスーパークラスは1つだけに制限されている。人間の考える系統図と同じように考えてはいけないようだ。
その理由を少し見たが、メソッド名がかぶったときの呼び出しとか菱型継承問題(diamond problem)とか、何やらここには深みがあるようだ。なおC++という別言語はこの多重継承を認めている。

しかし、一度用意したものを使えないのは厳しいものがある。そこで、クラスによる多重継承の代わりに、抽象クラスやインターフェイスによる部分的な多重継承のみを許すことで言語としてのシンプルさを保とうとしている。
インターフェイスの実装は2つ以上で行うことが出来る。また、インターフェイス自体を拡張し、サブインターフェイスにスーパーインターフェイスをextendsすることはできる。

終わりに

拡張による継承が許される部分を追ってみると、Javaは演繹的な展開が得意な言語なのかなと感じる。すでに出来上がったクラス・インターフェイスを知り、その機能を継承しながら新しいクラスを組み上げることを想定しているということは、まず標準ライブラリが用意した機能を知るところからJavaの勉強は始まるのだろう。

参考

出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

やさしいJava 第7版
Java SE11 Silver 問題集(通称黒本)

【vimコマンド一覧】viコマンドとは?gitbashでvimテキストエディタを使う方法

$
0
0

viコマンドとは?gitbashのvimテキストエディタの使い方

gitbashでショートカット(alias)の設定をしようとしたときに、「vi ~/」というコマンドが出てくる。
このコマンドの意味と使い方の簡単なまとめ。

■結論

結論からいうと、vimというテキストエディタを立ち上げるコマンド。
VScodeやatomなどの一般的なテキストエディタと異なり、見た目や使い方にクセがあるため、使い方については下で解説。

目次

  1. viコマンドとは?
  2. Vimエディタの使い方
  3. 挿入モード
  4. コマンドモード
  5. コマンドモードのコマンド一覧
    1. 保存と終了
  6. ノーマルモードのコマンド一覧
    1. 文字や行の削除
    2. コピペ
    3. 変更を戻す・進む
    4. 改行
    5. 範囲の選択
    6. 移動(カーソル)
    7. 画面移動
    8. 挿入モードに入る
  7. ビジュアルモードと矩形ビジュアルモードの違い

viコマンドとは?

いつ使う?
gitbash上で設定ファイルを開いて操作するときによく出てくるコマンド。
例:vi ~/desktop/test.html
 └ 中身は2つだけ。①vi, ②指定ファイル
 └ 「vi」コマンドでファイル「~/desktop/test.html」を開く

補足
gitbash(ターミナルやコマンドプロンプト)でパス指定で出てくる冒頭の「~」はホームディレクトリを指す。

「~」の詳細はこちら



意味は?
所説あるが、「Visual Editor」の略らしい。
└ 冒頭の2語?という印象だが、意味としては分かりやすい

Editorというだけあって、編集する機能。
現在使われているツールだと、テキストエディタに分類される。

viとvimの違い
viを調べると必ずでてくるのがvimという単語。
結論からいうと、「vi」=「vim」で問題なし。

viはwikiによると初版1976年と約40年以上前のもの。vimは2000年以降で普及してきたviの進化版。

コマンドは「vi」も「vim」もどちらもあるが、起動するエディタは同じ。

~2つとも同じ~
vi ~/desktop/test.html
vim ~/desktop/test.html

ちなみに、vimは「Visual editor IMproved」
の略らしい。

Vimエディタの使い方

■起動する
vi ファイルパス
 └ フルパスか相対パス

デスクトップのtest.htmlファイルを開く
vi ~/desktop/test.html

Enterを押すとすぐにエディタが起動。



■エディタ
立ち上がったエディタの画面。
image.png

大きく3つのパートから成る

①ファイルの中身
②何もない行
  └ 冒頭に「~」がある
  └ 画面を伸ばすと~が増える。狭めれば減る。
③コマンド入力欄
  └ 現在の状態も表示される

※分かりにくかったのが、キーボードで入力できる箇所が2つあること(①と③)

■モード
主に4つのモードがある

  1. 「挿入モード」
  2. 「ノーマルモード」
  3. 「コマンドモード」
  4. 「ビジュアルモード」

1. 「挿入モード」
・VScodeやatom、メモ帳のようなテキストエディタ
・上記キャプチャの①
・ノーマルモードの状態で、「i」をクリックすると挿入モードになる
・詳細はこちら



2. 「ノーマルモード」
・改行、行の削除・挿入、コピペができる
・vim立ち上げ時のデフォルト画面
・上記キャプチャ①の画面に対して実行される



3. 「コマンドモード」
・保存、vimの終了ができる
・ノーマルモードで「:」を押す
・上記キャプチャの③に入力できるようになる
・「esc」キーでノーマルモードに戻る
・詳細はこちら



4. 「ビジュアルモード」
・範囲選択ができる
 └ ノーマルモードでも可能だが、色が反転しないので選択は範囲がわかりずらい。
・コピペや削除で使用
・ビジュアルモードと矩形ビジュアルモードの2種類がある。詳細はこちら


■挿入モード

できること
ファイルの編集

挿入モードへの移り方
**iをクリック
(他にも挿入コマンドあり)

画面下のコマンドモードに「--挿入--」と表示されればOK
image.png

※マウスは効かない。移動はキーボードの矢印。

編集ができる。(例:h1タグの追加)
image.png



挿入モードから抜ける
escキーをクリック(←困ったらコレ)


▼挿入モードへの入り方

①指定箇所を選択
i: カーソルの前
a: カーソルの後ろ

②行頭か行末を選択
I: 行の先頭(shift+i)
A: 行の末尾(shift+a)

③空白行追加
O: 上に空白行を追加(shift+o)
o: 下に空白行を追加
 └ 追加行の先頭を選択(インデント合わせ)


■コマンドモード

できること
保存、エディタの終了(通常のgitbashに戻る)など。

一般的なテキストエディタでctrl押しながらする操作は、コマンドモードで行う。(※注意:コマンドが違う)

主な使い方

「:」をクリックするとコマンド欄に入力できるようになる。
└ 「esc」でノーマルモードに戻る

①一時保存
:w
 └ Enterで確定

コマンド欄に「:w」を入力
image.png

完了すると「"test.html" [dos] 14L, 270C 書込み」のように表示される。



②エディタを閉じる (通常のgitbashに戻る)
:q
 └ Enterで確定
 └ 変更内容を保存してないとエラーになる

image.png

変更保存前のエラー
「E37: 最後の変更が保存されていません (! を追加で変更を破棄)



③強制終了
:q!
└ Enterで確定
「!」は強制の意味を持つ

ctrl+zでも終了できる



④元に戻す(undo)
:u
 └ Enterで確定
 └ ノーマルモードで「u」も同じ


コマンドモードのコマンド一覧

■保存と終了

:w :保存
:q :終了
:wq :保存&終了
:q! :強制終了
:w! :強制保存
:w ファイルパス :ファイルに名前を付けて保存(既に存在するば場合はエラー)
:w! ファイルパス :ファイルに名前を付けて強制保存


ノーマルモードのコマンド一覧


■文字や行の削除

dd :行の削除
d0 :行の中で、選択位置から前を削除(d+ゼロ)
D :行の中で、選択位置から後をを削除

・挿入モードでbackspace
・ビジュアルモードで選択し「d」でも可


■コピペ

y :コピー(選択後)
yy :1行コピー
d :切り取り(選択後)
p :貼付け

※「ヤンク」という言葉が出てくるが、「コピー」と同じ意味。(linuxではコピーのことをヤンク(yank)という)


■変更を戻す・進む(undo, redo)

u :変更を戻す
ctrl+r :変更を進める

■改行

コマンドモードで改行
o:改行(下に改行を追加。挿入モードになる)
O:改行(上に改行を追加。挿入モードになる)



挿入モードで改行もできる
ctrl + o + o :下で改行
ctrl + o + O :上で改行
 └ 「ctrl + o」で挿入モード中にコマンドを一つ入力できるモードに入る
 └「o」改行を押す


■範囲の選択

一般のテキストエディタとは選択方法が異なる
(shift+カーソルは使えない)
選択方法は①「m」マーキングと②「v」ビジュアルモードの2種類がある。

m :マーキング
 └ カーソルがある位置でマーキング
 └ 画面右下に「m」文字が表示される

▼操作方法
1. 選択を開始する位置にカーソルを移動
2. 「m」キーを押す
3. 選択の終端にカーソルを移動
4. コマンド(例:「y」コピー)を押す



v:ビジュアルモード
 └ 選択範囲が分かりやすくなる(背景色が変わる)

▼操作方法
1. 選択を開始する位置にカーソルを移動
2. 「v」キーを押す(ビジュアルモードに入る)
3. カーソルを移動し(範囲が広がる)
4. コマンドを入力
5. 「esc」キーを押す(ビジュアルモード終了)

ビジュアルモードと矩形ビジュアルモードの違いについて


■移動(カーソル)

0 :行の先頭へ移動
$ : 行の末尾へ移動(shift +4)
- :一行上の先頭へ移動
gg : 先頭行へ移動(HOME)
G :最終行へ移動(END)
j :1行上へ移動
k :1行下へ移動
h :左へ移動
l :右へ移動


[補足]

その他のコマンド
shift + h:先頭へ移動(≒HOME)
shift + l:末尾へ移動

hjklはキーボードの並び順

hjkl


■画面移動

ctrl + d :画面を上にスクロール
ctrl + u :画面を下にスクロール

矢印でも代替可
shift + ↑ :画面を上にスクロール
shift + ↓ :画面を下にスクロール


■挿入モードに入る

i: カーソルの前
a: カーソルの後ろ
I: 行の先頭(shift+i)
A: 行の末尾(shift+a)
O: 上に空白行を追加(shift+o)
o: 下に空白行を追加


■ビジュアルモードと矩形ビジュアルモードの違い

範囲選択するビジュアルモードには①ビジュアルモードと②矩形ビジュアルモードがある。
それぞれ選択範囲が異なる

①ビジュアルモード v
始点から、終点までを全て選択

選択範囲の間がすべて選択状態になる。
image.png



②矩形ビジュアルモード ctrl+v
列単位で範囲選択。
※矩形とは:四角という意味。正方形や長方形のように四角く選択できる

四角く範囲を選択できる
image.png

選択した範囲で、文字を置換したいときなどに有効。





トップに戻る

【Ruby on Rails】railsでやってみたいこと。

$
0
0

rails入門参考動画

Ruby on Rails 5入門(ドットインストール)

やりたいこと(目標)

  • 1.基本的なcrud作成 (create,show,index,delete)
  • 2.DBのselect結果を反映したセレクトボックスの作成
  • 3.入力データと登録済みデータの比較(登録済みデータが存在すれば、 エラーメッセージを出して登録させない)
  • 4.恐竜登録ツールのrails版の作成
  • 5.恐竜画像登録ツールのrails版

rails_try1.jpg


高階関数を書いたら、中級者になれた気がした。を批判したら上級者になれた気がした。

$
0
0

はじめに

「高階関数を書いたら、中級者になれた気がした」という記事を読んで色々ともやもやしたので批判をしてみる。といった趣旨の記事です。

きっかけはこちらのツイートから⇒https://twitter.com/ababupdownba/status/1241509344329363457?s=20

早速見ていこう

あの記事の流れは、社長の無茶ぶりに頑張って答えながら進んでいくというものだ。

最初の社長の指令はこうだった。

社長「お仕事を持ってきたで」
社長「今日は↓こんな関数を作ってくれ」

  • 引数として受け取ったHTML要素の高さを100ピクセルにする

社長「関数の名前はsetHeightで頼むわ」
社長「使うときのイメージとしては↓こんな感じや」

そしてそれに対応したコードがこれだ。

// boxと言うIDを持った要素を取得。constbox=document.getElementById("box");// 関数を呼び出して高さを設定。setHeight(box);
constsetHeight=element=>{element.style.height='100px';};

ここまでは特に悪い所は無い。(強いて言えばsetHeightという名前は少々わかりずらいので、setElementStyleHeightとかの方がよさそうといった所)

そして次の社長の指令はコチラ

社長「一つだけ要件を言い忘れてたんや・・・」

  • 高さを100ピクセルにして、更に背景色を赤くしたい場合もある

そしてそれに対応して修正したコードがこれだ。

// 高さを100ピクセルにするだけの場合setHeight(box);// 高さを100ピクセルにして、更に背景を赤くしたい場合setHeight(box,true);
constsetHeight=(element,toRed)=>{element.style.height='100px';if(toRed){element.style.backgroundColor='red';}};

このコードにはひとつ問題点がある。
まあ、あえてこのような問題のあるコードにしてあるのは後で高階関数を使うための布石なのだろうが、そもそもこの例では高階関数を使うメリットは微塵もないので指摘していく。

[問題] 関数の命名がおかしい
setHeightはその名が意味するなら、高さを設定する関数だ。なので、背景色を赤にする処理を記述するのは間違っている。
正しくはこうするべきだろう。

// 高さを100ピクセルにするだけの場合setHeight(box);// 高さを100ピクセルにして、更に背景を赤くしたい場合setHeightAndToRed(box);
constsetHeight=(element)=>{element.style.height='100px';};constsetHeightAndToRed=(element)=>{setHeight(element);element.style.backgroundColor='red';};

しかし、よく考えてほしい。社長はsetHeight関数を作って欲しいと言っているのだ。
だが、あきらかにsetHeightは命名がおかしいのでここは頑張って社長を説得するしかない。

とまあ、こんな感じであの記事ではsetHeight関数にどんどん機能が上乗せされていく。高さを変えるという以外の機能が、だ。

あの記事では最終的にsetHeight関数の実装は以下の様になる。

constsetHeight=(element,toRed,width)=>{element.style.height='100px';if(toRed){element.style.backgroundColor='red';}// 第三引数のwidthがあったら、要素の横幅を変更するif(width){element.style.width=width+'px';}};

setHeight関数があまりにも機能を持ちすぎているという問題をあの記事では、コールバック関数というものを使って解決している。
そのコードがこちら。

constsetHeight=(element,callback)=>{element.style.height='100px';callback(element);}
setHeight(box,element=>{element.style.color='green';element.innerHTML='こんにちわ!';});

高さを100pxにすること以外の処理をコールバック関数に任せることで、機能を分割しているのである。
まあ、正直言って酷いコードだ。

[問題]そもそもコールバック関数を使うメリットが無い
コールバック関数なんて複雑で読みにくいものなんか使わずに、以下のようにすればいいだけなのだ。

constsetHeight=(element)=>{element.style.height='100px';}
setHeight(box);box.style.color="green";box.innerHTML="こんにちわ!";

コールバック関数を使う適切な動機ではない。

そして最後にもう一つ気になるのがこちらの説明。

ハスケル子「そうです」
ハスケル子「ちなみにfunc君はここでしか使わない関数なので」
ハスケル子「名前をつけないで無名関数にしてもいいかもですね」

ワイ「なるほど」

setHeight(box,element=>{element.style.color='green';element.innerHTML='こんにちわ!';});

ワイ「↑こういうことやな」

ハスケル子「ですね」

お気づきだろうか。無名関数とは、function(){}のように関数名を省略した関数のことである。
しかし、ここで使われているのはelement=>{...}となっており、これはアロー関数である。無名関数ではない。

問題まとめ

  • 例で出てくる関数の命名が適切ではない
  • コールバック関数、および高階関数を使うメリットが全くない場合なのに、むりやり使っている。
  • 無名関数とアロー関数を混同している。

じゃあ、高階関数を使うメリットってなんなの?

それは、設計において処理の責務処理呼び出しの責務処理結果の扱いの責務を分離したいときに使うものである。

例1

まずは処理の責務処理呼び出しの責務とを分離する例を見てみよう。

以下は5回カウントダウンした後に特定の処理をするFiveCountDownerクラスの実装と使用の例である。

classFiveCountDowner{constructor(){this.currentCount=0;}update(){this.currentCount++;if(this.currentCount==5)this.invoke();//処理呼び出しの責務を果たしている}invoke(){//処理の責務を果たしているconsole.log("起きて―!!");}}constfiveCountDowner=newFiveCountDowner();fiveCountDowner.update();fiveCountDowner.update();fiveCountDowner.update();fiveCountDowner.update();fiveCountDowner.update();

https://wandbox.org/permlink/PCXFpXrMLlrEPi5I

注目すべきは責務だ。FiveCountDownerクラスは5回カウント後に処理されるInvoke関数の実装を持っているし、Invoke関数がいつ呼び出されるかも管理している。(5回カウントされた後にのみ呼び出すということですね)
これはつまり、FiveCountDownerクラスは処理の責務処理の呼び出しの責務も担っているということになる。
もし、5回カウント後に実行される処理内容を柔軟に変えれるようにしようとしたらどうすればいいだろうか?
それは、FiveCountDownerクラスから処理の責務を分離する必要があることを意味する。
試しにクラスを分けてみようか。

//処理の責務を果たしているclassOkite{invoke(){console.log("起きて―!!");}}//処理の責務を果たしているclassNero{invoke(){console.log("寝ろ");}}classFiveCountDowner{constructor(processObject){this.currentCount=0;this.processObject=processObject;}update(){this.currentCount++;if(this.currentCount==5)//処理呼び出しの責務を果たしているthis.processObject.invoke();}}constfiveCountDowner1=newFiveCountDowner(newOkite);fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();constfiveCountDowner2=newFiveCountDowner(newNero);fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();

https://wandbox.org/permlink/jebwILGCsiwvnn9e

このようにして、責務を分割して処理を柔軟に変更することができた。
しかし、考えても見てほしい。いちいち新しい処理が増えることにOkiteとかNeroとか毎回クラスを作ったりするのは面倒ではないか?
そこで高階関数を使う。
以下が高階関数を使ったversionだ。

classFiveCountDowner{constructor(callback){this.currentCount=0;this.callback=callback;}update(){this.currentCount++;if(this.currentCount==5)this.callback();}}constfiveCountDowner1=newFiveCountDowner(()=>console.log("起きて―!!"));fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();fiveCountDowner1.update();constfiveCountDowner2=newFiveCountDowner(()=>console.log("寝ろ"));fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();fiveCountDowner2.update();

https://wandbox.org/permlink/cQmlfjq0OQu9PJxB

このように、関数にクラスを渡すのではなく、関数を渡す。関数に関数を渡すことが高階関数というものである。

例2

例1では処理の責務処理呼び出しの責務とを分離する例だった。ここにさらに、処理をした結果の責務について考えていこうと思う。
そのために、以下の問題を例として使う

  • 数値の配列の要素一つ一つを倍にした配列を作るdoubleArray関数を実装してほしい。元の配列を直接変更しても構わない。
  • 数値の配列の要素一つ一つから-10にした配列を作るtenMinusArray関数を実装してほしい。元の配列を直接変更しても構わない。

まずは何も考えずに実装してみよう。

constdoubleArray=(array)=>{for(leti=0;i<array.length;i++)array[i]=array[i]*2;returnarray;};consttenMinusArray=(array)=>{for(leti=0;i<array.length;i++)array[i]=array[i]-10;returnarray;};console.log(doubleArray([1,2,3,4]))console.log(tenMinusArray([10,20,30,40]))

https://wandbox.org/permlink/77zhhqzApnmMyH2X

このコードには無駄がある。まずはそれを見つけるために処理を分解していこう。

  • 配列の中身を1つずつ取り出すfor文
  • array[i]=の要素更新処理結果を代入する
  • 要素を更新する処理array[i]*2array[i]-10
  • 結果を返すreturn文

要素を更新する処理以外は共通する部分だ。
処理の責務を要素を更新する処理。
処理呼び出しの責務をfor文内の処理。
処理をした結果の責務を要素更新処理結果を代入する処理と考える。
そうして、処理の責務だけを関数から分離したmapArray関数を高階関数を使って実装してみよう。

constmapArray=(array,callback)=>{for(leti=0;i<array.length;i++)array[i]=callback(array[i]);returnarray;}constdoubleArray=(array)=>mapArray(array,x=>x*2);consttenMinusArray=(array)=>mapArray(array,x=>x-10);console.log(doubleArray([1,2,3,4]))console.log(tenMinusArray([10,20,30,40]))

https://wandbox.org/permlink/QXzZ5Vs6XjxSBNsE

例2(オマケ)

例2はカリー化と部分適用を使ってさらに綺麗に美しく書くことができる。
まあ、これを美しいと感じるかどうかは人によるが。

constmapArray=callback=>array=>{for(leti=0;i<array.length;i++)array[i]=callback(array[i]);returnarray;};constdoubleArray=mapArray(x=>x*2);consttenMinusArray=mapArray(x=>x-10);console.log(doubleArray([1,2,3,4]))console.log(tenMinusArray([10,20,30,40]))

https://wandbox.org/permlink/3kqkUYJHuyHPLUR3

高階関数まとめ

高階関数はあくまで、責務を分離する書き方の一つのパターンでしかない。

EC2の起動設定と起動テンプレートの違い

$
0
0

そもそも起動設定って何?

EC2インスタンスを起動するために、AutoScalingグループで使用される設定です。
よくあるユースケースとしてAutoHealingと呼ばれる、インスタンス障害発生時に障害インスタンスを削除し、新規インスタンスの起動で使用されます。

起動テンプレートと何が違うの?

起動テンプレートは起動設定の後継となるサービスとなります。
AWS公式ユーザガイドにも、以下のように記載されております。

Amazon EC2 の最新機能を確実に使用できるようにするために、起動設定ではなく起動テンプレートを使用することをお勧めします。

起動設定と比較すると設定可能な項目が多いため、詳細なユースケースに対応することが可能です。
また、起動テンプレート単体でEC2起動が可能なので、AMIからの手動展開が楽になります。

小ネタ

AWSマネジメントコンソールにて、作成済みのEC2インスタンスをチェックし、「Create Template From Instance」をクリックすると、自動で起動テンプレートが作成されるのでオススメです。
0CC3BE44-4518-470B-98B3-DAACC0DD0C9E_4_5005_c.jpeg

参照

Unknown action [初心者備忘録]

$
0
0

Unknown action

railsでアプリを作成していたところ、初めて見るエラーが発生しました。
結果からいうとコードの誤記という恥ずかしいイージーミスでしたので、反省と忘れないために書きたいと思います。

エラー発生

Users::RegistrationsControllerのnew_credit_cardアクションを実行したところ以下のエラーが発生しました。

Unknown action
The action 'new_creditcard' could not be found for Users::RegistrationsController

なるほど、アクションがないのか。
ということで、RegistrationsControllerを確認します。

解決

以下がコントローラーで当該のアクションを呼び出してる箇所とroutes.rbです。

uses/registrations_controller.rb
render:new_credit_card
config/routes.rb
get'creditcards',to: 'users/registrations#new_creditcard'

しっかりアクション名を書き間違えていました。
ということで、これを修正することでエラーが直りました。

おわり

今回はアクション名がルーティングとコントローラーで不一致だったためエラーが起きましたが、呼び出したいアクションをコントローラーのprivate以下に書いた場合でも、今回と同じエラーが起きるそうです。
最後まで見ていただきありがとうございました。

Swiftで簡単なコードを書いてみた(初心者向け)

$
0
0

はじめに

アプリ開発に最近興味を持ち始めSwiftについて勉強したことのアウトプットとして書きました
初心者向けの簡単な文法や記述方法について触れています

Swiftって?

誰もが圧倒的に優れたアプリケーションを作れる、パワフルなオープンソースの言語です(Appleサイトより)

主に下記アプリの基幹言語として使用されています
・iPhoneアプリ
・OSXアプリ
・Apple Watchアプリ
・tvOSアプリ

環境構築

WindowsやLinuxでもSwiftは動かすことは出来ますが、やはりMacを使用するのが適しています
また、実際に開発を行うのは「XCode」というソフトを使用します

詳しくは下記サイトで環境構築をしてみてください
XcodeとSwiftを使ってアプリ開発を体験してみよう

実装

681E9860-93E4-4D46-B44A-1322FFA9FF9F.jpeg

Xcodeをインストール後、以下の画面が表示されるので、今回はplaygroudを使用していきます

playgroudは名の通り、遊び場のように作ってはすぐに実装の確認をすることが出来ます

Single Viewを選択し適当な名前を付けます

[実行画面]
02A67201-011F-466A-9B8C-6B00AA1E9CD2.jpeg

初期の起動時に、自動的にHello Worldを出力するソースがあるので、とりあえず実行してみました

実装の確認を同一の画面で確認出来ることが分かると思います

簡単な記述方法

それでは簡単なコードをSwiftで記述していきます

1.文字の出力

print("Hello Swift")//実行結果//Hello Swift

と記述することでテキスト出力します(改行あり)
Java等に比べると、シンプルに記述可能です

2.if文

varnum=1ifnum<10{print("10より小さい値です")}else{print("10より大きい値です")}//実行結果//10より小さい値です

varで変数を定義し、if文で判定を行っています
ちなみに、変数numにカーソルを当てQuick Helpというツールを使うと自動的に変数の型を明示してくれます。これも便利ですね
BFC8C3F9-DD17-4A0D-8724-AAAC0C5FA983_4_5005_c.jpeg

3.for文

fornin1...5{print(n)}//実行結果//1//2//3//4//5

1から5までの繰り返しを記述します
こちらも独特な書き方ですが、分かりやすいです

4.while文

varcnt=0varsum=0whilecnt<5{cnt+=1sum+=cnt}print("cnt:\(cnt)")print("sum:\(sum)")//実行結果//cnt:5//sum:15

終わりに

ここまで読んで頂きありがとうございました
今回は簡単なSwiftの記述方法に触れましたが、他の言語と比べ書き方が相違する所はありますが、簡略して書けるのではと思います
これからもSwiftについて勉強していこうと思います

SourceTreeインストール方法

$
0
0

はじめに

SourceTreeは、GitをGUIで扱えるツールです。
ここでは、SourceTreeのインストール方法について、解説します。
後日、初期設定についても追記する予定です。

SourceTreeのダウンロード、インストール

SourceTreeのダウンロードページにアクセスします。
「Download」をクリックすると、インストーラーがダウンロードされます。

sourcetree_download.PNG

指示に従って進んでいくと、インストールが完了します。

sourcetree_top.PNG

このような画面が立ち上がれば完了です。

まとめ

ここでは、SourceTreeのインストール方法について解説しました。
コマンド操作に苦手意識のある人でもGitを扱えるようになります。

Viewing all 21429 articles
Browse latest View live