Linux チートシート基礎編

本当によく使うLinuxコマンドのチートシート(基礎編)#本当によく使うLinuxコマンドのチートシート(基礎編)

今いるディレクトリってどこなの?現在のディレクトリの名前を表示する
```$ pwd```

ディレクトリの中身を表示```$ ls```
ディレクトリ移動したいホームディレクトリへ移動
```$ cd```
指定したディレクトリへ移動
```$ cd [移動先ディレクトリを指定]```
ファイルを移動させたい```$ mv [移動させたいファイルを指定] [移動後のファイル名を指定]```
ファイルをコピーしたい``` $ cp [コピーしたいファイルのディレクトリとファイル名を指定] [コピー後のディレクトリとファイル名を指定]```
ファイルを作成したい```$ touch [作成したいファイルのディレクトリとファイル名を指定]```
ファイルの中身を表示``` $ cat [表示したいファイルのディレクトリを指定]```
ファイルの末端10行を表示```$ tail [表示したいファイルのディレクトリを指定]```
ファイルを削除したい```$ rm [削除したいファイルのディレクトリとファイル名を指定]```
ファイルをディレクトリごと削除したい```$ rm -rf[削除したいファイルのディレクトリを指定]```*確認メッセージは出ないので注意してコマンドを打つこと。
ファイルやディレクトリの権限の変更```chmod 777[ファイルやディレクトリを指定]```*上記777は全てのユーザーにrwxを渡している
数字3桁の左から、所有者、グループ、その他r = 4、w = 2、x = 1で覚えると覚えやすい。
読み込み権限・・r書き込み権限・・w実行権限・・xrwx 7rw- 6r-x 5r-- 4-wx 3-w- 2--x 1--- 0
ファイルをダウンロード```$ wget [ファイル名を指定]```

日付の表示```$ date```
現在のコマンドの終了```$ control + c```
現在のセッションの終了```$ exit```

 

 

有馬記念をきっかけに機械学習を始める

qiita.com

pythonを知る

とりあえず馬のマスタデータを集める

```
# coding: UTF-8

# CSV
import csv

# 時間
from datetime import datetime
import time

httpリクエス
from urllib.parse import urlparse
import urllib.request, urllib.error
import requests

htmlparse
from bs4 import BeautifulSoup

pandas
import pandas as pd

data init
data_scheme = ['name', 'age', 'total_attend', 'bad_attend', 'good_rate']
csv_head = ["名前", "年齢", "生涯出走回数", "4位以下になった回数", "1位から3位に入る打率"]
target_horses = ["ヤマカツエース", "キタサンブラック", "クイーンズリング", "ブレスジャーニー", "トーセンビクトリー", "サトノクロニクル", "シャケトラ", "レインボーライン", "サクラアンプルール", "シュヴァルグラン", "ルージュバック", "サトノクラウン", "ミッキークイーン", "スワーヴリチャード", "カレンミロティック", "サウンズオブアース"]

CSV init
csv_lists = []
csv_lists.append(csv_head)

class Scrape:
def current_time(self):
現在の時刻を年、月、日、時、分、秒で取得します
time = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
return time

def create_search_horse_url(self, horse):
アクセスするURL
search_template = 'https://keiba.yahoo.co.jp/directory/horsesearch/?status=1&fhn=&mhn=&mfhn=&mmhn=&tn=&on=&bn=&minage=&maxage=&hn='
url_string = search_template + horse
request_url = urlparse(url_string)
query = urllib.parse.quote_plus(request_url.query, safe='=&')
url = '{}://{}{}{}{}{}{}{}{}'.format(
request_url.scheme, request_url.netloc, request_url.path,
';' if request_url.params else '', request_url.params,
'?' if request_url.query else '', query,
'#' if request_url.fragment else '', request_url.fragment)
return url

class Horse:
def get_attr(self, name):
element = ''
if name is 'name':
element = soup.find("h1", class_="fntB").get_text()
elif name is 'age':
element = soup.find(id="dirTitName").find_all("p")[0].get_text()[-3:-2] # 今回は競走馬が1けたのためこれでOK
elif name is 'total_attend':
element = soup.find_all(class_="mgnBL")[0].find_all("td")[5].get_text()
elif name is 'bad_attend':
element = soup.find_all(class_="mgnBL")[0].find_all("td")[4].get_text()
else:
print("Marcos Vechionacci")
return element

for i in range(len(target_horses)):
scrape = Scrape()
horse = Horse()

1カラム目に時間を挿入します
#csv_list.append(time_)
url = scrape.create_search_horse_url(target_horses[i])
res = requests.get(url)
if res.status_code == 200:
soup = BeautifulSoup(res.text, 'lxml')
# aタグの取得
r_horse_name = horse.get_attr('name')
if r_horse_name == target_horses[i]:
r_horse_age = horse.get_attr('age')
r_horse_total_attend = horse.get_attr('total_attend')
r_horse_bad_attend = horse.get_attr('bad_attend')
r_horse_good_rate = 1 - float(int(r_horse_bad_attend)) / int(r_horse_total_attend)

csv_list = [r_horse_name, r_horse_age, r_horse_total_attend, r_horse_bad_attend, r_horse_good_rate]
csv_lists.append(csv_list)

df = pd.DataFrame(csv_lists, columns=data_scheme)
# CSV ファイル (employee.csv) として出力
df.to_csv("mst_horse.csv")

```

結果.csv

```
,name,age,total_attend,bad_attend,good_rate
0,名前,年齢,生涯出走回数,4位以下になった回数,1位から3位に入る打率
1,ヤマカツエース,5,7,6,0.1428571428571429
2,キタサンブラック,5,13,2,0.8461538461538461
3,クイーンズリング,5,8,6,0.25
4,ブレスジャーニー,3,1,1,0.0
5,トーセンビクトリー,5,3,3,0.0
6,サトノクロニクル,3,1,1,0.0
7,シャケトラ,4,4,4,0.0
8,レインボーライン,4,8,5,0.375
9,サクラアンプルール,6,2,2,0.0
10,シュヴァルグラン,5,7,3,0.5714285714285714
11,ルージュバック,5,9,8,0.11111111111111116
12,サトノクラウン,5,9,6,0.33333333333333337
13,ミッキークイーン,5,9,3,0.6666666666666667
14,スワーヴリチャード,3,2,1,0.5
15,カレンミロティック,9,8,5,0.375
16,サウンズオブアース,6,9,6,0.33333333333333337
```


ちょっと雑に始めてみて継続的に改修しようかと。

買ってみた
2-13-10 3連単
13-2-10 3連単
9 単勝

を100円ずつ

有馬記念の結果
2-3-10

大外れ。

次にやること
レース結果を元に解析することで有馬記念の反省を行う。

RailsアプリケーションをPWA化する目論見

qiita.com

 

 

そもそもPWAとは

Progressive Web Apps
ウェブとアプリの両方の利点を兼ね備えたアプリです。
モバイル寄りのためコンバージョンやアクティブユーザのKPIの向上にも役立つかと。

 これがすごいぞPWA

  • ウェブなのに全てのページがオフラインで動作するためフライトモードでも動作する。
  • プッシュ通知が飛ぶ
  • ブラウザの機能を使用できるため非ログインユーザ以外のユーザアクションを計測可能
  • インストールが不要のためインストールの際の離脱が減る。

 PWAを実現するための要件

  • レスポンシブデザイン
  • Service Workers
  • Web App Manifest
  • HTTPS通信であること
  • Web App Manifest ホーム画面に追加できるため1タップでサービスへきてくれる!

 必要な要件

  • モバイルフレンドリーなデザインであること(タブレットと携帯端末がメインのため)
  • Service Workersが導入されていること オフラインで動作させるために必須

 対応ブラウザと必要なツール群

この記事参照
やばい、iOSにネイティブアプリ要らなくなるかも。SafariもPWAに対応する可能性

 SEO大丈夫?

よく見かける質問で
1ページしかインデックスされていないのは)PWA のせいかな?
というポストがあるが、サイト構造の問題らしい。

 URLを動的に書き換えればSEO的にも問題はない

オフラインで遷移するため、URLが自動で書き換えられないためこの現象が発生する
Googleが作ってるだけあってSEOは大丈夫な模様。(断言はできないが)
SEO対策はこちらの記事参照

 Railsアプリケーションに導入

# config/environments/production.rb

Rails.application.configure do
  # ...

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true

  # ...
end

Service Workerの導入

# Gemfile

gem "serviceworker-rails"

 初期化

$ bundle install
$ rails g serviceworker:install

 自動で生成されるファイルはこれ

config/initializers/serviceworker.rb - Railsアプリケーションのためのconfigファイル
app/assets/javascripts/serviceworker.js.erb - ServiceWorkerのサンプルとメインファイル?
app/assets/javascripts/serviceworker-companion.js - ServiceWorkerをブラウザに登録するためのファイル
app/assets/javascripts/manifest.json.erb - Readme的な公開する設定情報
public/offline.html - オフラインのスタートページ

 ServiceWorkerのライフサイクル

 サンプルプロダクトとドキュメント

 所感

ドキュメントも探せばいろいろ出てくるのでそこまでトラブルはなさそうな肌感。
あまりトラップっぽいところはなさそう。
1回サンプルプロダクトを年末年始で書いて検討する価値はありそうかと!

Railsで11sかかるリクエストを0.5sにした話

Railsで11sかかるリクエストを0.5sにした話

 

qiita.com


m

# 高速化の手筈を整える
リクエストを高速化するためには、まず遅い原因を見つけることが大事!

# rack-mini-profilerの導入
コードの実行からレンダーまでの内訳を分析できるので、Rails高速化の分析には必須

# rack-mini-profilerの恩恵
- N + 1問題
- 実際のSQL
- slow query
Railsで実装するとActiveRecordSQLをよしなに組み立ててくれるため、ちょっと違和感のあるSQLが多々ある。

# 具体的に何が確認できるの
ここで確認できることは
- SQL の中身と時間
- レンダーにかかる時間


```
$ vi Gemfile


gem 'rack-mini-profiler', require: false

```

# rack-mini-profilerの開発環境での準備

```
$ bundle exec rails g rack_profiler:install
```

# rack-mini-profilerの設定ファイル

```
$ vi config/initializers/rack_profiler.rb

if Rails.env == 'development'
require 'rack-mini-profiler'

# initialization is skipped so trigger it
Rack::MiniProfilerRails.initialize!(Rails.application)
end

```

# 準備は整ったので分析開始
Rails serverを再起動すると画面左上にページのロードにかかった時間が表示されるようになる。


# あれ、画面左上にないよ!
僕の環境の場合、htmlファイルじゃないと表示されなかったので、
実際の該当ページをリロードして、そのあと別タブで自分のサイトの404のURLを叩いて確認しました!


# あれQueryが以上に多い
そ、それは、N+1 問題の可能性が大きい。
具体的に話すとeach分の中でexists?などオブジェクトの検索がかかると再度Queryが走るため要注意。

サンプルコード

```
articles.each do |article|
if article.comments.exists? # ここでN+1です
puts article.comments.author
end
end
```

 

# あとは遅いクエリーを徹底的に速くする
雑に書くと

```
class ArticleService
def recommend_article_first
article = Article.recommend_article.first
#ここでarticleがN回呼び出される
{
id: article.id,
url: article.url,
title: article.title,
category_id: article.category_id,
}
end
end
```

#なんでこれがだめか

文法的におかしいだろは置いといてObjectを生成してみると分かる通り、毎回違うObjectが生成されていることがわかります。


# だめな例
```

class Onigiri
def hello
puts "Hello"
end
end

puts Onigiri.new.object_id
70283626235260
=> nil
puts Onigiri.new.object_id
70283622696580
=> nil
puts Onigiri.new.object_id
70283626251680
=> nil

```

オブジェクトが再生成されないことがわかる

# 良い例
```

class Onigiri
def hello
puts "Hello"
end
end

@onigiri = Onigiri.new
=> #<Onigiri:0x007fd85d264110>
puts @onigiri.object_id
70283626225800
=> nil
puts @onigiri.object_id
70283626225800
=> nil
puts @onigiri.object_id
70283626225800
=> nil

```
毎回同じObjectが使われていることがわかります。

#実際の使い方
```
class Onigiri
# 例1
def hello
@hello ||= puts "Hello"
end

# 例2
def world
@world ||= Begin
world= puts "World!"
end
end
end
```

# 最後に言いたいこと

高速化には、実際の遅い要因を把握することが大事で、それに対して必ず適切な方法があるので、頑張って見つけることが重要!
Rubyは幸いにもドキュメントが充実してるので比較的高速化しやすい言語かと!

Mac よく使う開発ツール

#よく使う開発ツール

##クラウドストレージ
###DropBox
[DropBox](https://www.dropbox.com/ja/)
ファイルは大体**Googleドライブ**か**DropBox**に入れますね。
複数端末で管理したい時は、**Dropbox**を使うという使い分けをしています。
パソコンの容量がなくなって来た時にも、一時的な保存に便利です。

##DBクライアント
###SequelPro
[SequelPro](http://www.sequelpro.com/)
無料で高機能で便利ですね。
**HTTPトンネル**には使えないのが、少し痛いです。

##画像編集
###Pixelmator
[Pixelmator](http://www.pixelmator.com/)
無料で**Photoshop**の代わりに使えるソフトです。
操作がわかりやすく、手軽に使えます。

##画像圧縮
###TinyPNG
[TinyPNG](https://tinypng.com/)
png形式もjpeg形式もドラッグ&ドロップで圧縮できる画像圧縮ソフトです。


##コマンドラインツール
###Homebrew
[Homebrew](http://brew.sh/index_ja.html)
ライブラリや、コマンドなどの導入が圧倒的に楽になるので、絶対に入れておきたいですね。

##作業効率アップ
###Alfred
[Alfred](https://www.alfredapp.com/)
作業中に他のアプリの起動や切り替えを早く行う事ができる作業効率upのソフトですね。

##バージョン管理ツール
###codebreak
[codebreak](http://codebreak.com/ja/)
和製github
無料でプライベートリポジトリが持てるのですごくありがたい。

###github
[gihub](https://github.com/)
もちろん、本家もご紹介。

##スマホ・PC間でデータを自在に転送できるソフト
###pushbullet
[pushbullet](https://www.pushbullet.com/)
複数端末でファイルやリンク送る時に重宝しますね。

##コンタクトを入れる時使います
###FaceTime
defalutで入っています。
Macがあればどこでもコンタクトを入れることができます。
## 随時他に使ってる良ソフトを更新します。
-Keynote
-Pages
-iMovie
-numbers
-Skype
-Slack
-245cloud
-misoca
-keynote
-MAMP
-Atom
-Blocs
-Adobe Creative Cloud
-feedly

おすすめの開発が捗るツールがあれば教えてください。

ブログ始めました!

ここでは、その日読んだ記事や、本のついての感想やメモを残しておくための場所として投稿していきます!

 

基本的に読む本や記事のカテゴリーは

IT・テクノロジーといったカテゴリーですが、

その他興味のあることを随時書いて行きたいと思います。

 

まあ基本的にはメモです

 

よろしくお願いいたします。