OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressで「ドメイン名またはURLを変更するときの」引越し手順

#はじめに
開発環境(MAMP)から本番環境(Linux)にWordPressサイトを移行しました。
「ドメイン名またはURLを変更する」WordPressの引越しは、最初手こずりました。苦労しただけで終わりたくないので、作業手順の一部を紹介します。

#読者対象
WordPressサイトの引越し作業を迫られている。WordPressのデータとデータベース(sql)を新しい環境にインポートしたが、サイト画面が何も表示されず困っている方。

#この記事でやること
WordPress設定ファイル(wp-config.php)のDBおよびサイトURL情報の書き換え

1.「wp-config.php」のDB情報の書き換え
2.「wp-config.php」のサイトおよびホームのURL書き換え
3.「.htaccess」のアクセス情報書き換え

#wp-config.phpの編集
##①wp-config.phpとは？
>wp-config.phpファイルは、WordPressのインストールを行なう上で最も重要なファイルの1つです。このファイルはWordPressのファイルディレクトリのルート直下に置かれ、中にはMySQLデータベースへの接続情報などサイトの基盤となる詳細な構成情報が含まれます。

参考URL
「wp-config.phpの編集／WordPress Codex 日本語版」
http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86

##②wp-config.phpを編集する
WordPressファイルの編集には、***下記以外のエディタ***を推奨されています。

* Microsoft WordやGoogleDocsのようなワープロアプリ…「バイナリファイルとなるため不可」
* Windowsのメモ帳(Notepad)…「UTF-8 BOMあり」でしか保存できないため不可

※筆者は普段Bracketsを使っています。

##③データベース設定を編集する
エディタからwp-config.phpを開き、DB情報を設定してください。

※以下はデフォルトのwp-config-sample.phpの例です。

```
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'database_name_here' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'username_here' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'password_here' );

/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );
```

#サイトおよびホームのURL書き換え
##wp-config.phpの「siteurl」と「home」を移行先の情報に書き換える
```
define('WP_SITEURL','サイトのURL');
define('WP_HOME','ホーム画面のURL');
```

#おわり

#参考URL
「WordPressの引越し ／WordPress Codex 日本語版」
http://wpdocs.osdn.jp/WordPress_%E3%81%AE%E5%BC%95%E8%B6%8A%E3%81%97
python + ajaxのPOST通信では、urllib.parse.unquote_plus()を使うべし

　ajax+python通信で、エンコードしたパラメタをPOSTする時、リクエストに半角スペースが含まれていると、スペースはpython側で"+"に自動変換される。
　なので、python側では、"+"を半角スペースに置き換える必要があるので、unquoteではなくunquote_plusを使う。

```main.js
//送信側

//空白ありのパラメタ
let param = encodeURI("space space");

//実際に送信されるパラメタ
//space%20space  <- まだ、スペースは%20のまま

```

```main.py
#受け取り側

param = "space+space"  #なぜか、%20 -> + に置き換わっている

urllib.parse.unquote_plus(param)  #"+"をスペースに置き換える

```

割とはまったので、報告まで。

追記
特殊記号もエンコードする場合は、下記を使用する。

```main.js
//送信側

//特殊記号（ここでは"+"）を含むパラメタ
let param1 = encodeURI("a + b");           //a%20+%20b
let param2 = encodeURIComponent("a + b");  //a%20%2b%20b

```

```main.py
#受け取り側

param1 = "a+++b"    #a   b <- "+"が半角スペースに置き換えられる
param2 = "a+%2b+b"  #a + b

urllib.parse.unquote_plus(param)  #"+"をスペースに置き換える

```
MacでのPythonのバージョン切り替え方　Udemy 【3日でできる】はじめての Django 入門 

# はじめに
[【3日でできる】はじめての Django 入門 ( Python 3 でウェブアプリを作って AWS EC2 で公開！）](https://www.udemy.com/django-beginner/)で勉強させてもらっています。
井上先生ありがとうございますm(_ _)m
勉強していく中で僕が躓いてしまったことを皆さんと共有したいと思います。

# お断り
体系的な知識を有しているわけではないので誤った情報を記載している可能性がございます。
その点はご認識いただければと思います。。。
有識者の皆さま、たまたま見かけて内容的に大丈夫そうだと思っていただけたら肯定のお言葉を頂戴できたら幸いです。

また、この手順のまま実施していただくと2018年12月28日現在

- Python3.7
- Django2.1

という環境になります。
つまりDjango1.1を用いている講座とは環境が異なってしまいます。
その点もご了承ください。

ということで
## 先に結論（推測）：レクチャー4、5でコケたこと
①Pythonのバージョンがデフォルトで入っているもの(2系)から変わらなかったこと
→「.bash_profile」でPATHを変えれば良いが、もしかしたら変えなくてもいいかもしれない。

②condaコマンドが認識されなかったこと
→Anacondaインストール時に「自分専用にインストール」をちゃんと選択すること。

## 私が辿った道
### ①について
[Q&A](https://www.udemy.com/django-beginner/learn/v4/questions/5636346)見たら
> Anaconda 3をインストールすると、仮想環境を追加する時にPython 2.7かPython 3.5, 3.6, 3.7を選んで環境を作れます。

とあったので、仮想環境の作成をするレクチャー５へ行く（解決？？）

すると。。。

### ②condaコマンドが弾かれる
またまた[Q&A](https://www.udemy.com/django-beginner/learn/v4/questions/4805586)を確認すると
> anacondaのインストール時にmacOSでのPATH設定をするようメッセージが出ますが、環境変数にAnacondaのPATHを追加しているでしょうか？

そんなのでたっけ？？と思いながらとりあえず再度実践
インストール先を選べる箇所で「自分だけ」にしてインストール

```
$ which python 
/usr/bin/python　←①については変わっていない
```
変わってない。。。なるほど

「python 切り替え mac path」でググってみる

「.bash_profile」でPATHを設定するらしい
ということで

```
$ vim ~/.bash_profile
```
でエンター

見てみると、AnacondaのPATHを設定しているであろう記述が二つあった。
そりゃ2回入れたもんね。
ということで
キーボードから「i」と入力すると「insertモード」というものになって編集可能になるので
（vimというテキストエディターを直前のコマンドで呼び出しています。細かいことはググってください！）
私の場合は
古いほうのAnacondaのPATHを削除して　←おそらくこの時点で②が解決していると思う

```
$ export PATH=/Users/自分のユーザー名/anaconda3/bin/python:$PATH
```
を追記して「esc」を押下して「:zz」で抜けます。
この追記内容についてですが、「anaconda3フォルダ」配下の「binフォルダ」配下に「python」というファイルがあるはずなので、
それのフルパスを指定してあげれば良いです。
要は右クリックして「情報を見る」から「場所」に記載されている内容をコピペすればOK

```
$ which python 
/usr/bin/python　←まだ変わっていない
$ source ~/.bash_profile　←これしないとダメ
$ which python
/Users/自分のユーザー名/anaconda3/bin/python
```
とりあえず **①は解決！！**
これで②もいけるかな〜と確かめる

```
$ python --version
Python 3.7.1
$ conda create -n py36
Solving environment: done

## Package Plan ##

  environment location: /Users/自分のユーザー名/anaconda3/envs/py36


Proceed ([y]/n)? y

```

いけたっぽい

```
$ source activate py36
(py36) xxxxxx:~ 自分のユーザー名$ 
```

いけた！

若干インストール画面の遷移が変わっていたとはいえ、
しっかりと講座見ながら進めていれば防げたかもしれない。。。反省
Docker Toolbox利用時においてbuildができない。


#概要
Windows上、Docker Toolboxを利用してDockerを稼働させている際に、docker buildを行うとエラーになった。
権限かスペースの問題により、エラーが発生した。
ドライブ直下にスペースを含まないディレクトリを作成することで正常にbuildドできた。 

#発生エラー
C:\Users\desk\Desktop\dockerTestというフォルダで実行した。

```
$ docker build -t fortune-whale .
unable to prepare context: unable to evaluate symlinks in context path: readlink C:\Documents and Settings: Access is denied.

```


#エラー原因
スペースを含むパス、もしくは権限が原因でエラーになったと思われる。


#対応策
Dドライブ直下にディレクトリを作成し、そこでbuildしたところ成功した。

```
$ cd /d/dockerTest/
$ docker build -t fortune-whale .
```
.NET Core コンソールアプリでシークレットをレポジトリにPushしないようにする

# 問題

開発環境でAzureのリソースを使う時、多くの場合リソースの秘密鍵やデータベースのコネクションストリングなどが必要になります。最も一般的な、そして**最もやってはいけないやり方**が、コードに秘密情報をハードコードして、なおかつレポジトリにプッシュしてしまうことです。これはおそらくほとんど人に経験があって、なおかつ今もやっているかもしれない**NOT**ベストプラクティスです。

ただしこの問題はUserSecretという仕組みを使うことでおおよそ解決できます。幸い、Visual StudioでASP.NET Coreプロジェクトを作成するとデフォルトでVisual Studio に統合された感じで利用できる便利な仕組みなので、ASP.NET Coreプロジェクトを開発してるなら迷わずすぐに使うべきです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/103139/b07f5b23-d179-490f-61e2-d9bf368d633a.png" width=380>

対照的に、コンソールアプリケーションでは今のところVisual Studioに統合された形式ではサポートされていません。代わりに手動でプロジェクトの設定を変更する必要があります。

このブログエントリの目的はコンソールアプリケーションでUserSecretを使えるように設定したサンプルをシェアすることです。

## 解決

コンソールアプリケーションでUserSecretを使えるように、必要なNuGetパッケージも指定済みのテンプレートプロジェクトをGithubにアップしました。

https://github.com/yoshiwatanabe/code-examples/tree/master/donet/min-core-console

このプロジェクトでは、AzureのCosmosDBなどのリソースで必要になるリソースURLと秘密鍵を、プロジェクトとは別のローカルストレージににsecrets.jsonとして保存されている情報を自動的にコンフィギュレーションとしてワーカークラスにDIされるようにしています。

## コンソールアプリケーションプロジェクトで User Secrets を使えるようにする

これはすでにサンプルのプロジェクトで設定されていまが、解説しておきます。
1. 新規でGuidの値を生成し、.csprojに下のように設定します。

```
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <UserSecretsId>YOURNEWGUID</UserSecretsId>
  </PropertyGroup>
```

# ローカルのsecrets.json ファイルの作り方

`dotnet`コマンドラインツールを使って作成します。例えば、このプロジェクトではAzureのCosmosデータベースをリソースとして利用するので、リソースのURLと秘密鍵をシークレットとして保存します。このシークレットは%APPDATA%フォルダー下に、上のGuid値を使って保存されます。
1. CMDもしくはPowerShellコンソールを管理者権限で実行
1. `dotnet user-secrets set DocumentDbUrl "https://YOURACCOUNTNAME.documents.azure.com:443/"`を実行
1. `dotnet user-secrets set DocumentDbPrimaryKey "YOURPRIMARYKEYd9OA=="`を実行
1. テキストエディターを使って `%APPDATA%Roaming\Microsoft\UserSecrets\YOURNEWGUID\secrets.json`を開く
1. secrets.jsonの内容を以下のように変更する（MyWorkerSettingsはサンプルプロジェクトでクラスとして定義されています。）

```
{
	"MyWorkerSettings":
	{
	"DocumentDbUrl": "https://YOURACCOUNTNAME.documents.azure.com:443/",
	"DocumentDbPrimaryKey": "YOURPRIMARYKEYd9OA=="
   }
}
```

これでサンプルコードを実行すると、指定した秘密のデータがコンソールアプリケーションでも安全に使えるようになります。

# 注意

このやり方はあくまでもレポジトリに誤って秘密情報をPushしたりしないようにするのには有効ですが、秘密情報そのものは開発マシーンに暗号化されずに保存されています。マシンレベルでの機密情報管理でのベストプラクティスを続けて適用することが重要です。
個人でサーバレス(AWS Lambda)なサービスを利用するとコストは実際どのくらいか

個人的にAWS Lambdaを利用することが多くなり、そろそろコストが気になり始めたので、状況を確認してみました。


## 何に利用して、実行頻度は？

主にQiitaの記事用のバッチと、個人ブログの運用でAWS Lambdaを中心に利用しています。

### Qiitaの記事集計と投稿

Qiitaでストックやコメント数でランキングをしてみたらどういう感じになるか、Qiita API v2を利用してランキング記事を作成するのにお試しでAWS Lambdaを利用しています。

1回/8時間ごとに集計し、記事を更新しています。

Qiita週間ストック数ランキング【自動更新】 - Qiita
https://qiita.com/kai_kou/items/180a91fd88dbbbd746f6

Qiita週間コメント数ランキング【自動更新】 - Qiita
https://qiita.com/kai_kou/items/df87ebf338389a39062c


### 個人ブログ

こちらはQiitaをCMSと見立てて個人ブログを作成してみたらどうだろうと作りはじめて、11月末から運用開始しました。
Nuxt.jsを利用したSSRのサーバ部分と、コンテンツをQiita API v2から取得してS3へ保存する仕組みでAWS Lambdaを利用しています。

コンテンツ取得は1回/1時間ごとに、2018/11/25に立ち上げ、ちょうど1ヶ月くらいで、ページビューは300くらいです・・・~~悲しい、悲しい~~(2018/12/26時点)

とりあえずやってみる
https://qiilog.com/


### 月あたりの実行時間

CloudWatchなどを頼りにざっくりと合計時間を算出してみました。
月あたり7時間ほどAWS　Lambdaで処理を実行した感じです。

- 実行回数: 5,930回
- 実行時間: 41,718,000ms (41,718s)


|実行|実行回数|平均実行時間(ms)|合計実行時間(ms)|
|---|---:|---:|---:|
|ストック集計|93回|20,000|1,860,000|
|コメント集計|93回|50,000|4,650,000|
|コンテンツ取得|744回|7,000|5,208,000|
|ブログアクセス|5,000回|6,000|30,000,000|



## 明細

AWS マネジメントコンソールから12月請求予定の明細を確認してみました。11月だと確定しているのですが、ブログ運用開始が11月末だったので、12月で確認してみました。


どん。
<img width="905" alt="スクリーンショット 2018-12-26 15.46.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/75ea768a-7b35-e227-5159-8a54320998bf.png">

税込みで$1.74、ドル円が110.48円(2018/12/26時点)なので、月あたり192円くらいで運用できています。安！

※小さな文字で注釈がありますが、当日の請求情報が反映されていなかったりする未確定の請求情報です。

AWS Lambdaの利用料が$0.00となっていますが、月ごとの無料枠が設定されており、その枠内に収まっているみたいです。ありがたや。ありがたや。

しっかりと料金に関する説明を読んでみると、新規登録後に付与される無料枠とは別に、月ごとに設定される無料枠があるという記述があります。

料金 - AWS Lambda（サーバーレスでコードを実行）｜AWS
https://aws.amazon.com/jp/lambda/pricing/

>Lambda の無料利用枠には、1 か月に 1,000,000 件の無料リクエストおよび 400,000 GB-秒のコンピューティング時間が含まれます。Lambda 関数に割り当てたメモリ量によって無料利用枠で実行できる時間が異なります。Lambda の無料利用枠は、12 か月間の AWS 無料利用枠の期間が終了しても自動的に期限切れになることはありません。既存および新規の AWS のお客様は、無期限にご利用いただけます。

~~各サービスの詳細をみてみます。~~
と思ったのですが、ここまで書いて、そもそも明細を公開して良いものか不明確なことに気がついたので、AWSのサポートに問い合わせてから詳細を上げるか判断します。すみませんm(_ _)m

とにかく、実際にはどうよ？を共有できればと考えてまとめてみました。

## まとめ

AWS Lambdaは月ごとの無料枠が設定されているので、だいぶ安価に利用できますが、データ転送やS3の利用などは少なからず課金されるのでご注意ください。

個人で利用する分には相当頻度の実行やアクセスがない限りは比較的お安いコストで済みそうです。


## 参考

料金 - AWS Lambda（サーバーレスでコードを実行）｜AWS
https://aws.amazon.com/jp/lambda/pricing/
よく使うDockerコマンドのまとめ


#概要
自分用に学習したDockerのコマンドについて、以下にまとめる。


#コマンド

| コマンド | サンプル | 説明 |
|:--|:--|:--|
|docker version           |-                          | バージョンを表示させる。<br>インストール直後の動作確認に利用すると便利 |
|docker run <イメージ名>  |docker run hello-world     | 指定されたイメージを取得して実行する                         |
|docker pull <イメージ名> |docker pull hello-world    | 指定されたイメージを取得する。実行はしない。                  |
|docker rmi  <イメージ名> |docker rmi hello-world |   | イメージ名で指定されたイメージを削除する。
|docker images            |-                          | 取得済みのイメージの一覧を表示する。
|docker ps                |-                          | 稼働中のコンテナの一覧を表示する。
|docker ps -a             |-                          | 停止中も含めたコンテナの一覧を表示する。
|docker ps -a             |-                          | 停止中も含めたコンテナの一覧を表示する。
|docker rm <CONTAINER ID> |docker rm 35b595558dac     | 指定されたIDのコンテナを削除する。
VBAでMIDIファイルを再生するClass Module Win10 64/32対応 Play Midi File with VBA


FormにWindowsMediaPlayerを貼り付ける例はありますが、Declareで宣言する例はないようです。
Midiファイルは標準で入っているtown.midを使用しています。
Midiファイルは2分くらい再生されます。意外に音が大きいかもしれません。
MIDIというと個別のノート再生をする例もあります。将来はそれも考えています。コメントアウトしている部分があるのはそのためです。
ちなみにOutlookで再生しました。

#Class モジュール
```visualbasic

Option Explicit
'Class name :MidiClass
'2018/12/28
#If Win64 Then
    Private Declare PtrSafe Function midiOutOpen Lib "winmm.dll" (lphMidiOut As LongPtr, ByVal uDeviceID As Long, ByVal dwCallback As LongPtr, ByVal dwInstance As LongPtr, ByVal dwflags As Long) As Long
    Private Declare PtrSafe Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As LongPtr) As Long
    Private Declare PtrSafe Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As LongPtr, ByVal dwMsg As Long) As Long
    Private Declare PtrSafe Function mciExecute Lib "winmm.dll" _
(ByVal lpstrCommand As String) As Long
#Else
    Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, ByVal uDeviceID As Long, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwflags As Long) As Long
    Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long
    Private Declare Function midiOutShortMsg Lib "winmm.dll" (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long
    Private Declare Function mciExecute Lib "winmm.dll" _
(ByVal lpstrCommand As String) As Long
#End If
#If Win64 Then
    Private hMidiOut1 As LongLong
#Else
    Private hMidiOut1 As Long
#End If

Private m_bAudio As Boolean
Private mf As String 'Midi File
' 初期化処理
Private Sub Class_Initialize()
m_bAudio = False
mf = ""
End Sub
Public Sub MidiOpen()
    
    MidiClose
    midiOutOpen hMidiOut1, 0, 0, 0, 0
    
End Sub
' 終了時処理
Private Sub Class_Terminate()

Call MidiClose

End Sub

Public Sub MidiClose()

    midiOutClose hMidiOut1
    hMidiOut1 = 0
    
End Sub
Public Sub MidiSetInstrument(ByVal InstrumentID As Long)
    
    If hMidiOut1 = 0 Then MidiOpen
    midiOutShortMsg hMidiOut1, (256 * InstrumentID) + 192
    
End Sub

Public Sub Midi(action As String, MidiFileName As String)
If Dir(MidiFileName) = "" Then
MsgBox MidiFileName & vbCrLf & "Does Not Exist."
Exit Sub
End If
'Call MidiClose
'Call StopMIDI(mf)
mciExecute action & " " & MidiFileName
End Sub

Public Sub PlayMIDI(mf As String)

Midi "play", mf
End Sub

Public Sub StopMIDI(mf As String)
Midi "stop", mf
End Sub
' プロパティプロシージャ
Property Get PlayMidiFileName(getMidifilename As String) As String
  mf = getMidifilename
End Property

```

#標準モジュール

```visualbasic

Sub testPlaymidiFile()
Dim clsMIDi As New MidiClass
Set clsMIDi = New MidiClass

clsMIDi.Midi "play", "C:\Windows\Media\town.mid"
End Sub
```
AppEngineのデプロイで新バージョンにリクエストをゆるやかに移行する方法


# 概要

AppEngineを（何も考えずに）デプロイすると、すべてのリクエストが一気に新バージョンに流れるようになる。新バージョンの方はインスタンス数が0からスタートし、徐々にスケールアウトしていく。

インスタンス作成時には数秒程度の時間がかかるので、トラフィックか大きい環境だと特に、スケールアウト時にリクエストのタイムアウトが発生してしまう場合がある。

少しずつトラフィックを新バージョンに流せればいいのに…と思っていたら、そういう機能がすでにあった。

# 環境

* AppEngineのスタンダード環境
* Python3
* スケーリングタイプ：Automatic
* `inbound_services`に`warmup`を指定済み。（app.yaml）

# 解決

```
$ gcloud app deploy -v YOUR_VERSION --no-promote --project YOUR_PROJECT
$ gcloud app services set-traffic --splits YOUR_VERSION=1 --migrate --project YOUR_PROJECT
```

`--no-promote`を指定することで、新バージョンは作られるが、トラフィックは流れない。そして、次のコマンドの`--migrate`により、ゆるやかにトラフィックが移行される。


# 参考URL

https://cloud.google.com/appengine/docs/standard/python3/migrating-traffic#migrating_traffic_to_a_new_version
[zlib.js] JavaScriptでZIP圧縮する

JavaScriptでZIP圧縮することができるライブラリを紹介します。

zlib.js
https://github.com/imaya/zlib.js/

今回使用したJavaScriptライブラリのバージョンは下記の通りです。

```Markdown:JavaScriptライブラリ
Bootstrap: 3.3.7
jQuery: 3.3.1
zlib.js: 0.3.1
```

# ライブラリの読み込み

`zip.min.js`を参照します。

```HTML:index.html
<script type="text/javascript" src="../../lib/zlib/zip.min.js"></script>
```

# ZIPファイルをダウンロードする

画面上のテキストボックスやラジオボタン、プルダウンから、下記のようなJSONファイルを作成してZIP圧縮します。そのファイルをダウンロードします。

```JavaScript:sample/sample001.json
{
    "inputText1": "あいうえお１２３４５",
    "inputRadio1": "1",
    "select1": "3"
}
```

`strToUtf8Array()`で文字列からUTF-8の配列に変換します。`zip.addFile()`でZIP圧縮対象のファイルを指定します。`zip.compress`でZIP圧縮します。

```JavaScript:ZIP圧縮してファイルをダウンロードする
var zip = new Zlib.Zip();
var plainData = JSON.stringify(getJsonObj());
zip.addFile(strToUtf8Array(plainData), {
    filename: strToUtf8Array('sample/sample001.json')
});
var compressData = zip.compress();

var blob = new Blob([compressData], { 'type': 'application/zip' });

if (window.navigator.msSaveBlob) {
    window.navigator.msSaveBlob(blob, 'sample.zip');
    window.navigator.msSaveOrOpenBlob(blob, 'sample.zip');
} else {
    document.getElementById('export').href = window.URL.createObjectURL(blob);
}
```

[デモはこちら](https://yunbow.github.io/sample-zlib-js/02/01/)
[ソースファイルはこちら](https://github.com/yunbow/sample-zlib-js/tree/master/02/01/)

以上です。

# 関連記事

[[zlib.js] JavaScriptでZIP解凍する](https://qiita.com/yun_bow/items/1b9e86a2efe12432845d)
[[zlib.js] JavaScriptでZIP圧縮する](https://qiita.com/yun_bow/items/4eae0d521cc4237d20d1)
Jupyter DockerでJupyterを使う

* たまにJupyterを使いたくなる時があるので、気軽にDockerで使うときのメモ
* 特に意味は無いですが、この説明では`jupyter/scipy-notebook`イメージを使っています
  * どのイメージを選択するかは、[Selecting an Image](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html) を参考にしてください
* Dockerのインストールは別途行ってください

# Jupyterの起動

* ワークスペースを作成
  * パーミッションを適宜変更してください
      * ノートブックの保存ができない場合、見直してください  

```bash
$ mkdir jupyter-work
$ chmod 777 jupyter-work
```

* 現在のディレクトリをワークスペースとしてマウントして起動

```bash
$ cd jupyter-work
$ docker run -d -p 8888:8888 -v "$PWD":/home/jovyan/work  jupyter/scipy-notebook
1234567890abdefg
```

# Jupyterにアクセス

* ブラウザからアクセスするのに認証トークンが必要なので以下のコマンドでトークンを確認してください

```bash
$ docker logs 1234567890abdefg
ここにトークン情報がでてくる
```

* ブラウザからアクセス
  * `http://<hostname>:8888/?token=<token>`

# ワークディレクトリ

* 自前のcsvなどを入力として使用したい場合、`jupyter-work`に格納し、Jupyter側で適宜読み込んでください

```python
import pandas as pd
hoge = pd.read_csv('./hoge.csv')
```

* ノートブックの現在のディレクトリを確認したい場合は、セル内に以下の`magic command`を入力し実行することで確認できます

```python
In [1]: %pwd
Out[1]: '/home/jovyan/work'
```

# 参考

* [Jupyter Docker Stacks](https://jupyter-docker-stacks.readthedocs.io/en/latest/)
* [jupyter/docker-stacks](https://github.com/jupyter/docker-stacks)
* [JupyterのDockerイメージまとめ](https://qiita.com/kshigeru/items/ea174d6bcacc474f2a51)
* [IPython Built-in magic commands pwd](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-pwd)
DockerでDockerイメージが削除できない

#概要
docker rmiコマンドにてDockerイメージを削除しようとしたところ、エラーとなり削除できなかった。
イメージを削除するためには、稼働中のコンテナを停止させる必要がある。


#発生エラー

```
$ docker rmi hello-world:latest
Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 1fbe7dc39751 is using its referenced image 4ab4c602aa5e

```


#エラー原因
イメージを削除するには、コンテナが停止している必要があるため。
コンテナは稼働が止まっている状態でも、コンテナとしては存在は残っている。
よって、コンテナを削除してからでなければイメージは削除できない。


#対応策
ps -aで停止中のコンテナを確認できるため、コンテナ削除コマンドであるdocker rmを利用してコンテナを削除する。

```
docker ps -a
docker rm <CONTAINER ID>
docker rmi hello-world:latest
```
全てのWebサービスはtikTokに学びなさい @yumainaura #tiktok #hashtag #タイトル #不要論

#まだタイトル欄を作って消耗してるの？

ずっと‥10年前から思っていた‥

#ブログのタイトル欄を入力するのが面倒くさいんだよ‥！！！！

どんなに叫んでもYahooブログはおろか、Bloggerでさえタイトル欄を持っていた。

#あれ、tiktokの話じゃなくね？

まあ待て。俺も思い出せないがつなげていくぜ。

#時代は進んだ

Mediumではタイトルとdescriptionの区切りが「薄い」ハイブリッド型

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e5f453ba-157e-f58f-6e47-1c51c8284af5.png)


#ようやく時代が追いついた‥！

と叫びたいが、俺が実装したわけでも何でもないし。遠吠え。

#でもtiktokはさらに進んでるよね？

あなたは気付いただろうか。

tiktokではハッシュタグ「しか」入力できないことに。

#コンテンツは動画だ

本文は要らない。

#タイトルはハッシュタグだけだ

つまり、タイトルが存在しない。

コンテンツとハッシュタグだけが存在して、その入力のインターフェイスとして、まるで「タイトル入力欄」があるかのような、そんなイメージ。

#とここでアラサー男性プログラマはあることに気づく

tiktokでもハッシュタグじゃないのも入力できるじゃん！！！

画像略。

#なぜそう勘違いしたか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5a5237e6-493f-6c92-df0b-4426a6f33a06.png)

「ハッシュタグだけで全てを表す」使い方が、キラキラ系女子の間で流行っていそうだったから。

#つまりどういうこと？

日本女子高生、キラキラ系女子はtiktokより進んでいる。

#タイトルを変える。

全てのtiktokは日本女子高生に学びなさい。

#女子高生は最強である

UI UX サービスの世界の神である。

新世界のか‥

[tiktok最強yumainaura - Google Search](https://www.google.com/search?q=tiktok%E6%9C%80%E5%BC%B7yumainaura&oq=tiktok%E6%9C%80%E5%BC%B7yumainaura&aqs=chrome..69i57.3308j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#プログラマ #システムエンジニア #筋トレ @yumainaura #必要 #不要 / #ストレッチ #オススメ #ずぼらヨガ

エンジニアの生産性を支えるものはなんですか？

分かる人？


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2d6327b2-8213-02b6-7220-b7075430cdc0.png)


肉体ですよ。

#なぜ？

僕らが肉体で出来ているから。

忘れてた？

忘れてた。俺は。

#運動が嫌い？

ものすごく軽い1%のヨガがおすすめ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/89f0d3ce-f341-cdb7-53c3-c9f1c6d0334d.png)

#1日中ストレッチもおすすめ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/23f41cae-10ae-7f27-c17a-2256e4987227.png)

本当に微妙な体の使い方で、伸びちぢみを実現していく。


[運動yumainaura - Google Search](https://www.google.com/search?q=%E9%81%8B%E5%8B%95yumainaura&oq=%E9%81%8B%E5%8B%95yumainaura&aqs=chrome..69i57.3447j0j9&sourceid=chrome&ie=UTF-8)

#もういぢと硫黄‥もういちど言おう

エンジニアの生産性は何が支える？

#肉体です

信じられなかったらハローワークに電話。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#プログラマ #エンジニア #取扱説明書 @yumainaura

# エンジニアはこんな人間だ！

あくまで個人的意見だけど。

と言ってしまうあたりがエンジニア基質。

# 頑固な職人だ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/39fb54c0-7470-e617-6ca5-8e6461b173c7.png)
あなたのことを嫌いなわけじゃない。

ただ剣とか鎧とかを作っているだけ。

# 問題解決のスペシャリストだ。

なので問題を与えてやると、答えを出そうと魚雷のように発射する！

時に無口なのに、時におせっかいなのはそのせいだ。

子供みたいにすぐ道路に飛び出すぞ！

あたたかく見守ってやってください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5cc80ff3-de01-ef0a-58a4-17374091a530.png)

# すごく人見知りだ！


ただドキドキしているだけ。

飲食店で店員さんと目を合わさなかったり、ありがとうを言わなかったり。

あと「おはようございます！」とか体育会系みたいに言うのも無理。

ほんとコミュ障なんだけどどうにか許してほしい。悪気はないんだ。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7407afce-9331-f913-4b16-c731543c54b0.png)

#あとほとんどが男だ！

ところで女性がチームにいると、隠れ作用でチームがうまくいくという話をなにかの専門書で読んだ気がする。閑話休題。

[人見知りいなうらゆうま - Google Search](https://www.google.com/search?q=%E4%BA%BA%E8%A6%8B%E7%9F%A5%E3%82%8A%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&oq=%E4%BA%BA%E8%A6%8B%E7%9F%A5%E3%82%8A%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&aqs=chrome..69i57.3157j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Unity】キャラクターを上から落として床で止める

<font color="Magenta">キャラクターを上部から落として、床をすり抜けずに床で止める</font>

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Mac Book

![ezgif.com-crop.gif](https://qiita-image-store.s3.amazonaws.com/0/93155/78c12c94-9b0b-3afa-17f0-08145dd0ecc7.gif)


1.Assetsストアからキャラクター「Free Voxel Girl」をダウンロードしてインポートする
<img width="787" alt="スクリーンショット 2018-12-28 6.11.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/2ec12148-66c7-6a00-9ebd-535c1c217d4c.png">


2.Assetsストアから床「Yughues Free Wooden Floor Materials」をダウンロードしてインポートする
<img width="768" alt="Wooden.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/22017c76-f3b3-9f7c-af95-c2f7d66da9f3.png">

3.「Rigidbody」コンポーネントを追加する
「Use Gravity」チェックONする（重力あり）

「Capsule Collider」コンポーネントを追加する
キャラクターの周りを囲む

<img width="1116" alt="スクリーンショット 2018-12-28 6.13.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/7ee505ea-95c3-6eb4-99f5-a42a85499b95.png">

完成！！！

上から落として
<img width="280" alt="スクリーンショット 2018-12-28 6.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/b8852af0-4b4e-886b-ae65-adca3ea4a25f.png">

床面をすり抜けずに、ピタッと止まる。
<img width="224" alt="スクリーンショット 2018-12-28 6.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/ec8cff39-8386-83a0-7d02-30fa555eb63a.png">
無償でWindowsを利用する(Windowsの評価版を利用する)

#概要
Windowsは評価版がマイクロソフトから提供されている。
これを利用することで、既存の環境を汚すことなく、Windowsを使用することができる。

なお、利用は期限付きであり(後述の延長方法あり）基本的な利用期限は90日となる。
インストール容量は10GB程度。


##取得先
マイクロソフトの以下サイトよりISOファイルが取得できる。
https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-10-enterprise
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/79e248b0-de04-db8b-3b73-81dbb4f7d1af.png)



##取得すべきバージョン(Enterprise/LTSC)
Enterpriseを取得すればよい。
LTSCは組み込み向けの機器であり、通常用途には適さない。


##インストール
ISOファイルをVirtualBoxに読み込ませれば、そのままインストールできる。


##利用期限
以下のコマンドを利用することで、期限が延長できる。
-dlvが残りどれくらい延長できるかの回数を確認でき、rearmが実際に延長する。
rearmはライセンス残り日数が少ないときに実施したほうがお得。


```
slmgr -dlv
slmgr -rearm

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/422c4aaa-55bf-0efd-9cb3-e54ea9e36bf3.png)


##VirtualBox利用時の動作の改善
実際に私の環境で試したところ、それなりの高スペックマシン(i7 8700/メモリ 16GB)であるにも関わらず動作は少し遅い。
VirtualBoxへの設定としては、CPUとメモリは意識して設定しているが、他になにか設定しないときびきびとして動作にならない模様。
簡単な対策として、リモートデスクトップでのアクセスをすることにより、軽快に利用できるようになる。
VirtualBoxでExtension Packをインストールしたらエラーになった

#概要
VirtualBoxでExtension Packをインストールしたらエラーになった。
Extension Packは利用しているVirtualBoxのバージョンに合わせる必要がある模様。

#発生エラー
```
Failed to load the main module ('C:\Program Files\Oracle\VirtualBox\ExtensionPacks\Oracle_VM_VirtualBox_Extension_Pack\win.amd64\VBoxPuelMain.DLL'): VERR_SYMBOL_NOT_FOUND - GetLastError=127.

終了コード : 
E_FAIL (0x80004005)
コンポーネント: 
ExtPackManagerWrap
インターフェース: 
IExtPackManager {edba9d10-45d8-b440-1712-46ac0c9bc4c5}

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/8648ab1f-e48f-86e0-5330-b13f84c05a86.png)


#エラー原因
利用しているVirtualBoxとExtension Packのバージョンが異なるため

- 利用しているVirtualBoxのバージョン 5.2.12
- インストールしようとしたExtension Packのバージョン 6.0.0



#対応策
以下のページから利用しているVirtualBoxと同じバージョンである5.2.12のExtension Packをインストールした。
https://www.virtualbox.org/wiki/Download_Old_Builds
僕らは全身麻痺である @yumainaura #UI #UX #ツール #エンジニア #TIPS

#ツールを使いこなせないとはどういうことか

全身麻痺である。

#差別的発言？

と感じられたらごめん。

だが本当にそう感じる。もどかしさ。手に届かない背中。マヒマヒ感。

#たとえば？

全角半角スペースの切り替えに苦労しているとき。

ぐぐることが0.1秒で出来なくて途方に暮れている夕方。

MarkDownを書くことに疲れてすべてをフラットにしたScrapBox先生に学生は学びました。

編集度の高さのコストに驚いて、Qiitaでさえ下へ下へとフロー的に書くようになった川の流れのように。

MacBookAirのキーボードを愛しすぎて、Proのバタフライキーボードを憎んでしまったとき。

iPhoneを扱う手が不器用すぎて、練習を重ねた懐かしい日々。

Vimmerになろうと思ったけど、プロジェクトのファイルが一瞬で開けない状態が半年間続いて、SublimeTextに戻ってきたリハビリ期間。

どれもこれもがいとおしい。

思い出してご覧、これはすべて、僕らが人間でいえば、赤ん坊として生まれて、手足を使えるようになるまでの、涙ぐましい履歴なのだ。軌跡なのだ。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4bb1f547-ab2d-c88e-1b3a-572dff5ec318.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bce0c895-b7fb-926f-6c95-8e15256ed9ba.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/85f9be11-b993-0638-ab24-59e870862439.png)

#君は切実にUI UX キーボード ツール 開発環境設定 の大事さ、その絶え間ないリファクタリングの重要さをしみじみと感じているだろうか？

どうやったら感じられるだろうか？
我慢はだめだ。

#叫ぼう！

僕らは美徳ある短気なエンジニアじゃないか。

[短気いなうらゆうま - Google Search](https://www.google.com/search?q=%E7%9F%AD%E6%B0%97%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&oq=%E7%9F%AD%E6%B0%97%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&aqs=chrome..69i57.2517j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ぼくらはみんなじぶんだいすき！ソーシャルサービスの成功法 @yumainaura #UI #UX #Qiita #tiktok

それはむかしむかしのことじゃっった。

# Qiitaマイページのアクセス解析はこうしたい‥！

的な話からはじまりまった。時は例録23年。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/958d9e09-0f12-831b-3aff-42fbcb385f6e.png)

700記事達成！

おめでとう自分！

で、いつも見てるのってどこ？

たぶんContributionだよね！

上の円グラフってほとんど見ていない。

#人はだれでも自分が大好き

すなわちユーザーの最大の関心事って、自分ユーザーである。

#自分に優しいサービスが優しいサービスだ。

つまりユーザーの一番の関心事を、一番リッチに、一番大きく表示してあげて良い。

#グラフィカル

カテゴリ分類、比率もなにかの役には立つだろうけど「いいねがついた数」ほどに興味関心を集めるとは思えない。

ビジュアル的には賑やかで良いけれど。

Qiitaの他の人も「あれがせめてカテゴリ毎のリンクになっていればな‥」。「いまは使えるものではないし‥」と聞いたことがある気がする。

#じゃあどうすべき？

一番の関心事である「いいねが付いた数」をグラフ化するなど。

せめてリッチな表示にするとか。フォントを大きく「でん！」と表示してあげても良い。

#他のユーザーも関心事である

「この人はどれだけすごいひとなんだろー？」」ということを見ている。

自分のユーザー行動を思い出せばそうだ。

まず記事の内容より「誰が書いてるか」というコンテキストを、人間は自動的に判断するように出来ている。社会的な動物だから。

これは出版の世界にも言えること。すなわちWeb出版会社Qiitaでも言える。

#イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/229770dd-ffa2-d12f-c683-4b17c0c1e112.png)

#ソーシャルサービスは

「自分大好き」を応援して、ユーザーを気持ちよくするサービスであれば、中毒性が増してやめられなくなるかもね？

コミュニティづくりって、まずは「自分対自分」でおこなわれるもの。社会は1人だけでも実は成り立った！的な発想で設計してみても良いかも？

#自分大好きを押し上げるサービスナンバーワンと言えば

tiktokでしょ。

拡散用画像の@yumainaura的な自動ウォーターマーク。

あとは「いいね」「コメント」「フォロー」を大枠で色分けして設置していたり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/86c611d1-ce80-667e-3a47-884a04c5b8ef.png)

見づらくてごめん。

あと「me」っていうタブさえあるからね！

#世界中のアプリやサービスはtiktokから大事なことは全部学びなさい的なあれだ

女学生！が好きなものから学ぶべし。

ディズニーランドしかり。tiktokしかり。Instagramはちょっと大人っぽいけど。















<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
フォローは人のためならず @yumainaura #Qiita #Twitter

あああああの記事なんだっけー！

記事のタイトル思い出せない！

作者のアカウント名なんだっけ！どの人かは覚えてるんだけど！

記事が書かれた時期も定かじゃない、そういえばTwitterで拡散されてた気がするけど、Twitterから探すの無理だし…

Google検索でもぐぐれる自信がない！

といってる間に時間がどんどん過ぎていく、1行引用したいだけなのに！

だけど引用したいんだよー、素晴らしい記事なので！

Qiitaポエムよりそちらの記事を見てくださいごめんなさいアクセスした方々、って感じなのでせめてものお詫びに‥！

#自分のフォローリストが役に立つよ？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/833467cc-7ec9-d07f-5e4a-a3687a828684.png)


#Qiitaの記事一覧から探す例


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f34a048d-d6f6-5971-ec40-d4012cc0190a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e6fec0b5-0c81-41bd-0940-6e0558909d62.png)

そうこれこれ！

#Qiitaのフォローって何の役に立つの？タイムライン全然見られてないしなあ‥

と思っていたけれど、フォローは人の為ならず。

「自分の興味関心ごとが集まった最強の備忘録」じゃないか。

全然活用できていなかった自分を最大に後悔‥！

#ほかのソーシャルでも同じ

「自分のフォローリスト」は興味関心が‥以下略

[フォローいなうらゆうま - Google Search](https://www.google.com/search?q=%E3%83%95%E3%82%A9%E3%83%AD%E3%83%BC%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&oq=%E3%83%95%E3%82%A9%E3%83%AD%E3%83%BC%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&aqs=chrome..69i57.11654j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ユーザーが勝手に非同期処理するパターン @yumainaura

ポストボタンを押す。

次の画面が出てくる前にブラウザを閉じる。

サーバーでは処理がおこなわれているので、ユーザーはあとで戻ってくる。

ここでコールバックなどを呼んでいる場合は「画面を閉じないでください〜！」ってお願いをダイアログで出す必要がある。

個人的にはよく使っているハック。

理解していますか？仕組み。

投稿ボタンを押したあと、ぼんやりと何が起こっているかイメージできますか？

[デバッグは「うまく動かないピタゴラ装置の原因調査」だと考えてみよう - Qiita](https://qiita.com/jnchito/items/e4b75ff2c3eeccfffec1)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ba3d6e99-e86f-d211-df7c-b4d8fe8fc84a.png)


[yumainaura短気 - Google Search](https://www.google.com/search?q=yumainaura%E7%9F%AD%E6%B0%97&oq=yumainaura%E7%9F%AD%E6%B0%97&aqs=chrome..69i57.3005j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
誤解だった件。SEOに「はてなブックマーク」を活用してみてはと思ったけど？ by @yumainaura #ScrapBox #Qiita

別のタイトルたち。

# SEOに効果がある、ない、ちゃんと検証すれば推測できるよ

# Google でインデックス数を調べる簡単な方法があるよ

# HTMLソースを見て nofollow 属性を調べたりしよう。たとえばWikipediaからの🔗はSEOに役立たないよ。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ddd27d7f-7deb-c3b8-c2cb-fe898826854e.png)

なにかポストするたびに、必ずchrome のはてなブックマーク拡張で、自分でブクマするようにする。

QiitaはSEOに強いが、ScrapBoxは最初はまったくインデックスされなかった。Googleに。

はてなブックマークをつけるようになったタイミングでインデックスされ始めた。

効果の程は分からないが、その後、何をポストしても、必ずハテブを一個自分でつけるようにした。

Chrome拡張は爆速でほぼコストゼロ。


extentison設定でショートカット作成している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c67f4348-cced-413f-e4e7-8d9f1d539ae8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/56fbbf4c-2a66-660c-3164-4f656a0574e7.png)

Command+. という、割と重要そうなキー、だけど競合しなさそうなモノに設定。

検証

http://b.hatena.ne.jp/entry/s/qiita.com/YumaInaura/items/0d1541ebfe32595e623c

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/20d88be5-3322-f86f-bfb7-6c6cb540e186.png)

HTML

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f18e78d0-b5c1-41fe-00f3-bcdcf96578fa.png)

ここには nofollow 属性は付いていなさそう。ケチケチしてなくて良いね！

意味もなくリンクにとりあえずno follow属性をつけるサイトも多いところ‥。

はてなブックマークのページ自体がGoogleにインデックスされているかを調べてみる。

[site:b.hatena.ne.jp/entry/s/qiita.com/YumaInaura/items/ - Google Search](https://www.google.com/search?q=site%3Ab.hatena.ne.jp%2Fentry%2Fs%2Fqiita.com%2FYumaInaura%2Fitems%2F&oq=site%3Ab.hatena.ne.jp%2Fentry%2Fs%2Fqiita.com%2FYumaInaura%2Fitems%2F&aqs=chrome..69i57j69i58.2340j0j4&sourceid=chrome&ie=UTF-8)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c6b14784-f026-956f-535b-d7621d4f3fb3.png)

38件。

どうやら「はてなブックマークするとSEOに強くなるかも？」というのは誤解だったかも？

ということで現場からは異常です。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
失敗！ QiitaやScrapBoxの記事をなんとかしてGoogleサービスで外部公開・保存したい by @yumainaura 

# google docs import web でググる

なにか違う気がした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d47d0f30-37f8-b7d3-6480-a142565508c5.png)

# お試しでQiita記事をHTML保存

chrome secret mode これ大事。

login したままだと色々まずいものが入ってるかもだし。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d8530685-60a3-00d7-d511-57216066ffbb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4eec4979-7f71-67df-c0cd-d58c97493c4b.png)

# GoogleDriveにアップロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/18495573-36c4-1ae0-4705-0751f45ebfc2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0499e7f9-8d61-bfef-9590-d203ad081676.png)

なにか違う‥！気がした。Driveは違うような。そうですよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2c2df9dc-5df2-cba4-a864-5d19b2bd2f5b.png)

外部共有自体はできるっぽい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ae2ebf28-6e18-a631-cf04-1741d0391a06.png)



https://drive.google.com/file/d/1Ax5_ZbcehuJi8XPGAkHzouoEs_GK0Z1g/view?usp=sharing

わー！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3caa67fe-5250-382a-b404-170a3b663210.png)

# GoogleDocsは？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a54f601f-2a35-5b77-20c4-4521b595f773.png)

ファイル添付に対応していない？

oh its local

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/591c7e34-337a-753a-9c31-f4ceeb047947.png)

Driveと同じで外部公開自体はできるんだけど。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/de10f7c8-7eb4-4c6f-83e6-57966a864542.png)


# GoogleSitesは？

たぶん違う。

# Mediumは？Googleじゃないけど

サービス継続性に疑問あり。愛と信頼のGoogleが良い。

# Bloggerは？

UI UX 更新されてないし。10年古いし。インポートとかできなさそうだし。前に使ってたけど。

# ここで彼は力尽きていた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0e1950d1-0406-2891-4321-ed268ffde1d2.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UI UX がユーザー行動を変える by @yumainaura TW #Qiita @qiita 

# Qiitaでユーザー名の補完が難しいとどうなるか？

呼び捨て上等の失礼な人になってしまう。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bc6df86b-5997-34a7-8456-75be075ce9d1.png)

#風が吹けば桶屋がどうなる？

記事にコメントが付く。

その人に返信しようとするが、全ユーザーから補完されてしまう。

@あっと をつけるために膨大なエネルギーとコストと注意力が奪われる。

ユーザーは @あっと をつけなくなる。

コミュニティ形成にじわじわと影響を及ぼす。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Amazon.co.jpのAmazonPhotoとSynologyNASを同期させる際の注意事項

# Amazon.co.jpのPrimePhotoとSynologyNASを同期させる際の注意事項

## 始めに

以下の自宅環境でSynology 218+とAmazonPrimePhotoの自動同期を行った際の設定と注意事項を示す。
本記事は、米国アマゾン及び、日本アマゾンの両方でアカウントを持っている方が対象となる。いずれか一方のみの方は、特にひっかかかることなく同期できるので本記事の内容は不要である。
本記事はSynology製のNASであるDS218+にて実施したため、ほかモデルやバージョンでは多少異なる可能性がある。

## 前提

1. Amazon.co.jpのPrime会員であること
2. SynologyNAS上にCloud Syncがインストールされていること
3. 日本国内からアクセスしていること

## 環境

| 項目 | 内容 |
| --- | --- |
| NAS | Synology 218+ |
| DSM | DSM6.2.1-23824 Update2 |
| CloudSync | 2.3.10-1063 |
| 場所 | 日本国内 |

## CloudSync設定

以下の手順でAmazon Driveとの同期を行う。特に問題なければ、以下の手順で完了する。同期成功後は、AmazonPhotoにアクセスすると同期した写真がアップロードされる。

1. ブラウザよりDSMに接続し、CloudSyncを起動
2. CloudSyncの左下の **＋** を押し、クラウドプロバイダーから```Amazon Drive```を選択する。
3. ログイン画面で必要事項を入力する
4. タスク設定
    5. ローカスパスを設定
    5. データ暗号化設定は不要
    6. 高度なデータ整合性チェックは任意

![コメント 2018-12-28 023513.jpg](https://qiita-image-store.s3.amazonaws.com/0/198826/32119a61-9d90-4727-db59-7a1dc652b5c3.jpeg)


![Inkedコメント 2018-12-28 023844_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/198826/97827500-a034-6915-0ad4-190b4fc2dd5f.jpeg)

## 失敗原因の解明

本件を試したところ、よくわからない動作があったため、試行錯誤したところ、Amazon.comとAmazon.co.jpで同じE-mailでアカウントを作成しているとAmazon.com側のPhotoに写真がアップロードされてしまい、Amazon.co.jpのPhotoにアクセスしても写真が見れない様子。

以下に、Amazon.comとAmazon.co.jpのアカウントとPWの組み合わせに対する状況と対策をまとめる。ただし、2018年12月初旬時点の状況なので、Amazon側の仕様変更やCynology Cloud Syncの仕様変更で同じようになるとは限らない。

| 状況 | 発生する現象 | 対策 |
| --- | --- | --- |
| アカウントとPWが同じ | .comのPhotoに写真がアップロードされる | .comと.co.jpのアカウントの登録E-mailのいずれかを変更する |
| アカウントは同じだが、PWが異なり、.co.jpのPWを入力する | ログインに失敗する | .comと.co.jpのアカウントの登録E-mailのいずれかを変更する |
| アカウントは同じだが、PWが異なり、.comのPWを入力する | .comのPhotoに写真がアップロードされる | .comと.co.jpのアカウントの登録E-mailのいずれかを変更する |
| アカウントが異なる | .co.jpのPhotoに写真がアップロードされる | |

おそらく、ログイン時にAmazon.comでアカウントの認証を行い、アカウントが有ればAmazon.comで認証を行う。無ければAmazon.co.jpで認証を行う仕組みになっていると思われる。

## 最期に

日本国内からアクセスした場合はAmazon.comでのアカウントの有無により自動でAmazon.comとAmazon.co.jpにログイン先が切り替わるが、日本国外からアクセスした場合ではどのようになるか不明。
海外プロキシ等を利用し、日本国外からのアクセスの場合を、後日確認したいと思う。

## 参考

作成中
JavaScriptでトーストを表示する方法

# 概要
- JavaScriptでお手軽にトーストを表示する方法を紹介します
- 独立したライブラリなのでjQuery等への依存はありません。

![toasts.gif](https://qiita-image-store.s3.amazonaws.com/0/170905/8af3c489-30b9-4098-cea3-dd9d88cd40f7.gif)

# トーストを表示する

```html:index.html(トーストを表示する)
<!DOCTYPE html>
<html>
<head>
    <title>JsFrame.js JavaScript Toast</title>
    <meta charset="utf-8">
</head>
<body>
<script src="https://riversun.github.io/jsframe/jsframe.js"></script>
<script>
    const jsFrame = new JSFrame();
    jsFrame.showToast({
        html: 'This is a simple toast', align: 'top', duration: 2000
    });
</script>
</body>
</html>
```

デモ
https://riversun.github.io/jsframe/examples/v150/toast_simple.html

ある程度カスタマイズもできます
https://riversun.github.io/jsframe/examples/jaq/toast.html

![toastc.gif](https://qiita-image-store.s3.amazonaws.com/0/170905/e8d39a09-9a1e-e8c3-074f-47ebb1ee64ee.gif)

# まとめ

- ちょっとしたUI開発用途で使いたくて、拙作ライブラリに追加いたしました。
- ライブラリ自体はこちら[「フローティング・ウィンドウ ライブラリ JSFrame.js の紹介」](https://qiita.com/riversun/items/1adffa5674bc5123b16d)で紹介しています。
denoの標準ライブラリをVS Codeでいい感じに補完するためにやった作業

2018.12.29更新
@keroxp さんがとてもよい方法を発見されていたので、こちらに追記します。

https://mobile.twitter.com/keroxp/status/1078904266918526977

## 1. deno.d.tsを出力する
`deno types > ~/.deno/deno.d.ts`

## 2. 下記のtsconfig.jsonを使う

* .denoのパスは、ホームディレクトリまでの相対パス

```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "deno": ["../../../.deno/deno.d.ts"],
      "http://*": ["../../../.deno/deps/http/*"],
      "https://*": ["../../../.deno/deps/https/*"]
    }
  }
}
```

---

## 旧版

### 手順

1. deno用の作業用ディレクトリ(~/workspaceとする)を作る
2. ~/workspace内にdenoの補完を使いたいプロジェクト用のディレクトリを作成する
3. ~/workspace内に https://github.com/denoland/deno をCloneする
4. ~/workspace内に下記のtsconfig.jsonを置く

```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "lib": ["es2015"],
    "paths": {
      "deno": ["deno/js/deno"]
    }
  }
}
```

あとは、 ~/workspace をVS Codeで開いて、プロジェクト内のtsファイルで

```ts
import { Reader, Writer } from 'deno';
```

するなりなんなりしてください。
↑の作業を勝手に行ってくれるVS Codeのプラグインがあれば欲しいので誰かお願いします🙏

---
2018.12.29 追記

@jinjor さんによると、下記のtsconfig.jsonでも結構警告が消えるそうです。
同じディレクトリ配下にdenoを置いておきさえすれば、pathsでエイリアス貼らなくてもよいみたいです

```json
{
  "compilerOptions": {
    "lib": ["es6", "es2018", "dom", "esnext.asynciterable"],
    "target": "es6",
    "module": "commonjs"
  }
}
```
Raspberry PiとWindows10をUSB-MIDI OTGで接続

# 概要

Windows PCとRaspberry PiをUSB接続し、Windows 10上からRaspberry PiをMIDIデバイス(MIDI Gadget)として見えるようにする。
RPi Zero Wなど、Bluetooth対応機であれば、BLE-MIDI化できる。

# 環境

* Raspberry Pi本体
* SDカード　※Raspbian Stretch Liteにsshdを導入済みの4GB以上のもの
* Micro USB Micro-Bケーブル、または、Pi Zero USB Stem　※Raspberry Pi本体への電源供給方法

# 手順

## Raspberry PiでUSB-MIDI OTGを設定

1. Raspbian OSを起動する。
1. Raspberry PiをWindows PCにUSB接続する。
1. sshコンソールを開き、Raspberry Piにログインする。
1. 編集前に、設定ファイルをバックアップする。

    ```
    $ sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak
    $ sudo cp /boot/config.txt /boot/config.txt.bak
    ```
1. `/boot/cmdline.txt`ファイルを編集する。

    ```
    $ sudo vi /boot/cmdline.txt
    ```
1. rootwaitに続けて、または、rootwaitとquietの間に` modules-load=dwc2,g_midi`を挿入する。

    ```
    #dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
    dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_midi quiet splash plymouth.ignore-serial-consoles
    ```
1. `/boot/config.txt`ファイルを編集する。

    ```
    $ sudo vi /boot/config.txt
    ```
1. `dtoverlay=dwc2`という1行を追記する。

    ```
    # Uncomment this to enable the lirc-rpi module
    #dtoverlay=lirc-rpi
    dtoverlay=dwc2
    ```

1. Raspbian OSを再起動する。

    ```
    $ sudo reboot
    ```

1. Windows 10でRaspberry Piが`MIDI Gadget`デバイスとして認識される。

## シーケンサーで`MIDI Gadget`デバイスを使用

1. シーケンサー(Cakewalk SONARなど)を起動する。
1. MIDI出力先を`MIDI function`に設定する。

## MIDI情報をダンプ

1. sshでRaspberry Piに接続し、MIDI情報をダンプするコマンドを実行する。

    ```
    $ amidi --dump
    ```
1. Cakewalkで曲を演奏する。
1. sshコンソールにMIDI情報がダンプ表示される。
Android StudioのTerminalでCygwinを使う

# はじめに
普段の開発環境はMacなのでいざWindowsで開発するとコマンドプロンプトの違和感がすごい。
そうだAndroid StudioやIntelli JIDEAのTerminalでCygwinを使おう。

元ネタ: [How to use cygwin bash in Android Studio terminal and start it at project directory?](https://stackoverflow.com/questions/33906263/how-to-use-cygwin-bash-in-android-studio-terminal-and-start-it-at-project-direct)

# 環境
- Windows10
- Android Studio 3.2
- Intelli JIDEA 2018.2.7
- Cygwin

# 設定
Cygwinは`C:\cygwin64`にインストールされている前提。
Cygwinを起動し`.bash_profile`に下記を追加。

```:.bash_profile
if [ -n "${IDE}" ] && [ "${IDE}" == "AndroidStudio" -o "${IDE}" == "IntelliJIDEA" ]; then
  cd -;
fi
```

`C:\cygwin64` に以下のファイルを作成。

```:Cygwin-IDE.bat
@echo off
set IDE=%1
C:\cygwin64\bin\bash --login -i
```

AndroidStudioの`Settings>Tools>Terminal`を開き`Shell path`を下記に変更。

```
"cmd" /c "C:\cygwin64\Cygwin-IDE.bat AndroidStudio"
```

IntelliJIDEAも同様に設定。

```
"cmd" /c "C:\cygwin64\Cygwin-IDE.bat IntelliJIDEA"
```

環境変数に引数が渡るので`.bash_profile`でIDE別に設定をしてもいい。

# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/233482/3e8e5e24-34a7-288b-5feb-1c6d51dae7fe.png)

# 備忘
- Cygwinはデフォルトでgitを入れてくれない。インストール時に含めておく。
- Cygwinを `C:\Program Files\cygwin64` 当にインストールすると、そのままだとAndroidStudioがShell Pathに設定したコマンドを実行できない。スペースでオプション扱いになる。

- 先駆者がいらっしゃった……タイトルまで丸かぶり「[IntelliJ IDEAのTerminalをCygwinにする](https://qiita.com/milu0_0_0/items/86322beac22501c9ddfe)」
Excelの統計分布系の関数の話 1（ポワソン分布編）

# Excelの統計分布系の関数の話 1

Excelを使っていて、これまで集計したデータを元に予測分析したくなることがあります。
しかし、統計に関して出回っている書籍の多くが「標準偏差」から「回帰分析」あたりの関数までを主な範囲としていて、「統計」カテゴリの関数をあまり使う機会はありませんでした。

今回は、自分自身のデータの分析と予測で必要となった「ポワソン分布」を初めとして、以下の簡単な解説を掲載します。

### 免責

- 初版は、公式との対応、もしくはパラメータの解釈のみです
- 近似できる部分などの「証明」については、追って掲載します
- 数学としての正確な書き方はしておりません

## 取り扱う統計関数

- ポワソン分布 (POISSON.DIST)
- ガンマ分布 (GAMMA.DIST)
- 負の二項分布(NEGBINOM.DIST)

基本的に``～.DIST``とつくものは、結果の値は $0 \leq y \leq 1$ の小数値で返され、書式を%に合わせると良いです。

## サンプルデータ

|a|b|
|---:|---:|
|2|0|
|3|1|
|2|1|
|2|0|
|3|1|
|1|1|

後で使う値 $\lambda$ は以下の通りとします。

```math
\begin{align}
\lambda &= \sum_{k=1}^{n} \frac{b_k}{a_k} = 0.308...\\
\Leftrightarrow \lambda^{-1} &= 3.25
\end{align}
```

## ポワソン分布編
ポワソン分布は、まれに発生する事象（1週間に発生する交通事故など）に適用出来る確率分布です。
単位時間(または事象1回の)の発生確率 $\lambda$ に対し、 $x$ 件発生する確率を求められます。

### 数式

グラフは直接はご用意できませんが、カシオの計算サイトが分かりやすいのでご覧下さい。
⇒[ポアソン分布（グラフ）](https://keisan.casio.jp/exec/system/1161228831)

ポワソン分布は、$x \in \mathbb{N}$ すなわち $x = 0, 1, 2, 3, ...$ の自然数（諸説あり）と、xの値1個（単位）ごとの平均 $\lambda$ をパラメータにとります。数式は以下の通り。

```math
f(x, \lambda) = \frac{e^{-\lambda}\lambda^x}{g(x)}, \quad g(x) = 
\left\{
\begin{array}{ll}
x \in \mathbb{Z} &\Rightarrow \Gamma(x+1) \\
x \in \mathbb{N} &\Rightarrow x!
\end{array}
\right.
```

以上の式が、``POISSON.DIST(x,λ,FALSE)`` に置き換えられます。

#### 補足
- $x = 0$ のとき、 $0! = \Gamma(1) = 1$ です。
- $x = 1$ のとき、指数分布 $f(x) = \lambda e^{-\lambda x}$ と一致します。
- $g(x)$ の上段はガンマ関数 $\Gamma(x)$ といい、階乗の取る値を正の実数へ拡張したものです。
- ガンマ関数は、 $x \in \mathbb{N}$ なら $\Gamma(x+1) = x!$ で置き換えられます。
- Excelは下段の自然数の場合を採用しています。

なお、ガンマ関数の定義は以下の通りです。

```math
\Gamma(s) = \int_{0}^{\infty}x^{s-1}e^{-x}dx
```

#### Excelの関数使用時の注意（エラーとなる範囲）

- $x \in \mathbb{Z}$ の場合、小数点以下は切り捨てられ $x \in \mathbb{N}$ と扱われます。(実数としての実装は自力のみ）
- 数値以外はエラーになります。
- また、$x < 0, \lambda < 0$ の場合もエラーとなります。

#### ※以下は検証中のため、正確さは保証できません
- 条件は $x \geq 0$ , $0 < \lambda \leq 6$ あたりが望ましそうです。(再度検証の可能性あり)

#### 累積確率

関数を使って $0 \leq k \leq x$ で累積確率を取りたい場合、Excelの場合は $x \in \mathbb{N}$ を取るので、Σを使います。
このときの関数を下記の式に対応させると、 ``POISSON.DIST(x,λ,TRUE)`` です。

```math
\sum_{k=0}^{x} f(k,\lambda) = e^{-\lambda}\sum_{k=0}^{x} \frac{\lambda^k}{k!} \quad (0! = 1)
```

### 例題（追記予定）
問題は用意してあるのですが、後日追記します。
【スクレイピング初心者向け】5分でできる！Qiita最新記事のタイトルを取得してみた！

最近pythonを使い始めたのですが、「pythonと言えばスクレイピングじゃね？」という謎の考えに囚われて、Udemyの講座を買ってしまいました。という訳で、簡単にスクレイピングしてみたのでメモ。

## 対象者
- スクレイピングしたことない人
- 前々から「スクレイピングってなによ！」と気になっていた人
- HTML/CSSの基本を理解している人
- for文等を使って簡単なプログラムを書くことができる人

## スクレイピングとは？
Webサイトから、特定のデータを取得することを指します。
今回は、Qiitaのサイトから1日のトレンド記事のタイトルをスクレイピングしてみました。
https://qiita.com/
<img width="811" alt="スクリーンショット 2018-12-28 0.58.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/124924/7f4869ee-bfd7-a8b8-47a2-0d41db20615a.png">

## 環境構築
### pythonのインストール
以下のサイトからpythonをインストールしましょう。
https://www.python.org/downloads/

ターミナルで以下のコマンドを叩いて、pythonとpipがインストールされているか確認しましょう。

```
$ python -V
$ pip -V
```

### seleniumのインストール
pythonでスクレイピングをする際にはBeautifulSoupかseleniumを使うことが多いみたいです。今回はseleniumをインストールして、スクレイピングを行なっていきます。

```
$ pip install selenium
```

##さあスクレイピング！
スクレイピングの基本的な考え方は

**1. どこのサイトの**
**2. どこの要素に**
**3. どのような処理をかけるのか**

です。以下の完成コードをコメントとともに見ていきましょう。

```py:qiita.py
# seleniumからwebdriverをimportする。
# webdriverを使って、ブラウザの操作をする。
from selenium import webdriver

# webdriverを使って、Google Chromeを開く。
browser = webdriver.Chrome()
# Qiitaのトップページにアクセスする。
browser.get('https://qiita.com/')

# Qiitaのトップページの中にある、classの名前が
# tr-Item_titleであるタグの情報を取得する。
items = browser.find_elements_by_class_name('tr-Item_title')

# 取得した複数の記事タイトルをfor文で展開する。
print('------') # 出力結果をわかりやすくするための記号列
for item in items:
    print(item.text) # item.textとすればタイトルを取ることができる。
    print('------') # 出力結果をわかりやすくするための記号列

# ブラウザを閉じる。
browser.close()
```

今回は、以下のようなことを行なっています。

**1. https://qiita.com/ の**
**2. class名tr-Item_titleから**
**3. textの情報を取得する**


ターミナル上で以下のように打ち込むと、1日のトレンド記事のタイトルを取得することができます。

```
$ python qiita.py
```

出力結果↓
<img width="861" alt="スクリーンショット 2018-12-28 1.18.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/124924/7f2d3886-c60e-4026-3b2f-1127b6c4ce4b.png">

##もっとスクレイピングしていきたい
Qiitaの記事タイトルをスクレイピングしてみましたが、多分もっと有益に使うやり方があるはず。今回の勉強で基本は抑えた気がしてるので、次回何か思いついたらまたスクレイピングしてみたいと思います。
swift4 - スワイプでtableviewのセル削除

## 実装

```swift:ViewController.swift

    //セルの編集許可
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
    {
        return true
    }
    
    //スワイプしたセルを削除　※arrayNameは変数名に変更してください
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCell.EditingStyle.delete {
            arrayName.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        }
    }

```

##　参考

https://qiita.com/Ryosuke-Hujisawa/items/cf00b02efc96b4330369
NodeJSで、requireされたのか、単体で起動されたのか判断する方法

expressで、テスト用に`app`インスタンスだけ取得したいけど、`app.listen`を同じファイルに書きたいって！！いう状況に陥った。

(`app.js`と`bin/www`みたいに分けるのがベストっぽいけど、あまり好きじゃない。)

## `require.main`と`module`で判別

`require`され、モジュールとして動いてるときは、`require.main !== module`

単体で起動されているときは、`require.main === module`となる。

## コード化

```javascript:sample.js
if (require.main === module) {
  console.log('直接起動されたよ！');
} else {
  console.log('requireされて、モジュールとして動いてるよ！');
}
```
UbuntuにAdobeCCをインストール

playonlinuxをインストールしてphotoshopcs6のポータル版をインストールすればいけます。
ただ、やっぱ重いです。

以下は古い実行ログです。
起動できなかったのですが、人によっては起動するのかも？

~~~~
sudo apt-get install winehq-stable
sudo apt -y install wine64
sudo apt install -y winetricks
winetricks allfonts
~~~~

~~~~
winetricks atmlib gdiplus vcrun2008 vcrun2010 vcrun2012 vcrun2013 vcrun2015 atmlib msxml3 msxml6 gdiplus
~~~~

~~~~
winecfg
~~~~

Windows8.1などに設定しておく。

~~~~
wget http://ccmdl.adobe.com/AdobeProducts/KCCC/1/win32/ACCCx4_5_0_331.zip
unzip ACCCx4_5_0_331.zip
wine Set-up.exe
~~~~

一応AdobeCCの環境設定で、最新のバージョンにする　をオフにするといけたりするみたい。

こちらを参考
https://www.youtube.com/watch?v=qo2DW7u3lw8
https://github.com/corbindavenport/creative-cloud-linux/blob/master/creativecloud.sh