OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3でjsonを返すAPIのHTTP status codeを設定したい人生だった

[CakePHP3でjsonを返すAPIをCakePHPの流儀に従って記述量少なく書きたい人生だった](https://qiita.com/kaibadash@github/items/adf655b097ace80c0ec2)の続き。

REST APIを書いていると、jsonとともにHTTP status codeを設定したいことがある。

# だめな方法

```php
$this->response->statusCode(403);
```

```
@deprecated 3.4.0 Use `getStatusCode()` and `withStatus()` instead.
```

動くけどだめです。
ずっと今のバージョンを使うならこれで良いだろう。

# なるほど `withStatus` ね

```php
$this->response->withStatus(400);
```

200が返る…。
withStatusの戻りをreturnすると今度はbodyが返らない。

# 結局こうした

```php
$response = new Response();
$response = $response->withType('application/json')
  ->withStatus($status)
  ->withStringBody(json_encode($something));
return $response;
```

動いたけど、本当にこれしかないの？
json_encodeとか書きたくないし、[前回](https://qiita.com/kaibadash@github/items/adf655b097ace80c0ec2)と比べて統一感がなさすぎる。
リンクから直接Slackアプリのchannelを開く方法


以前紹介した
[Slack公式アプリで直接DM画面が開けるように：URLスキームで起動するまでの手順 - Qiita](https://qiita.com/yoshi-taka/items/d9597d4341059a119b53)
の手順より簡単な方法が追加されました。

`https://#{yourteamname}.slack.com/app_redirect?channel=random`
とするとSlackクライアントより`#randam`に遷移できます。
(実際にURLをリンク、入力するときは#{}を省いてください)

`https://#{yourteamname}.slack.com/app_redirect?channel=@member-name`
ならSlackクライアントより`@member-name`さんのDMに遷移することができます。

`https://#{yourteamname}.slack.com/app_redirect?channel=日本語対応`
のように`#日本語対応`という日本語名channelにもリンクできます。

今回紹介した手順だと一旦web画面に遷移し、その後クライアントの画面が起動します。

遷移の無駄を省きたい場合は、
[Slack公式アプリで直接DM画面が開けるように：URLスキームで起動するまでの手順 - Qiita](https://qiita.com/yoshi-taka/items/d9597d4341059a119b53)
のSlackでURL Schemeを組み立てる方法を実行しましょう。

詳細は[公式ドキュメント](https://api.slack.com/docs/deep-linking)を確認ください。
LiveDataのDataBindingが失敗する

# 現象

- こうやろうとしたら

```SampleViewModel.kt
class SampleViewModel: ViewModel() {
	val name = MutableLiveData<String>()
}
```

```layout.xml
<android.support.v7.widget.AppCompatTextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@{viewModel.name}" />
```

- こんなエラーが出た

```
[kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
```

## 言い訳

- ここに書いてあるし

[Android Studio release notes  |  Android Developers](https://developer.android.com/studio/releases/#3-1-0)

> Updates to data binding
> This update includes several improvements for data binding:
> 
> You can now use a LiveData object as an observable field in data binding expressions. The ViewDataBinding class now includes a new setLifecycle() method that you use to observe LiveData objects.

### 出来るはずだ！

- サンプルプロジェクト作って試したときも出来た！！


# 原因
* `com.android.tools.build:gradle` が3.0系だった
*  3.1以上にしよう

```
dependencies {
    classpath 'com.android.tools.build:gradle:3.1.3'
}
```

→諸事情でアップデートできない。ObservableFieldに変える。

- **導入したいプロジェクトで**ミニマム実装して試さなきゃ駄目だ。
ゲームやアプリでの全世界配信タイトルは共通のアイコンを作るべき

### ローカライズ対応の際に手戻り
アイコンにテキスト文字を入れているとその文字を全て全世界の言語に対応しないといけないので、半端ない工数や手戻りが発生する。

それを最初から考えずに、既存のよくある*NEW*や*DL*などの文字列で進めていくと後でローカライズ対応で**泣くのはメーカー側**だ。

## **記号**を使えばそれは解決する。

例えば、人数とか表記しているものをわざわざ字で表記するといろいろな国の言語で異なる表現になるのでそれだけで画像修正の工数がかかる。半日作業。

- 人数マーク 👤
最初から人数は人間のマーク。例えばトイレの男や女の記号のようにすればそもそも人数を測る時は問題なくなるはず。

- NEWマーク
こちらも★や光を表す記号にすれば事足りる。新しい製品というものは新品でピカピカというイメージだ。

- DLCマーク
 ダウンロードするときの↓矢印のようなアイコンを用意すればOK

これだけで全世界共通化できるのだから。
既存の文字列で表記する仕組みではなく画像や記号からグローバル化していくべき。
ビルドとデプロイって結局なんやねん！？！？！？？？みたいな記事

#ビルドとデプロイとは
ソフトウェア開発してるとでてくる用語ですね。
Jenkins使ってて雰囲気でしか分かってないなーと思ったんでまとめてみます。

#辞書的意味
[Weblio辞書](https://www.weblio.jp/content/)さんより

+ ビルド

>**ビルド**とは、コンピュータやソフトウェア関連の用語としては、ソースコードとしてコーディングされたソフトウェアを、コンパイル、リグレッションテスト、リリースノートや関連ドキュメントの生成、第三者に提出したり配布したりするための専用のファイルの生成、などを行う一連の工程のことである。

+ デプロイ

>**デプロイ**とは、主にネットワークを通じて提供されるWebアプリケーションなどのシステム開発工程において、システムを利用可能な状態にすることである。
**デプロイ（deploy）**という言葉は元々、配置する、展開するといった意味の英語である。デプロイはソフトウェアのリリースやインストールも含んだ意味の広い言葉であり、開発環境からステージング環境へシステムを反映させることも、ステージング環境から本番環境へ反映させることも、「デプロイする」と表現できる。

#くだいてみる

辞書的な意味が結構わかりやすくてびっくりした。。

+ ビルド

これまでソースコード1つのプログラムしかやってなかった経験からだと、書いたソースコードをちゃちゃっと機械語に翻訳して実行ファイルを作成するのがコンパイルだ、と思ってたんですが、
厳密には少し違うみたい。

大きなプロジェクトを作成するときなんかはソースコードのファイルは**たくさんある**。
そのそれぞれのソースコードをそれぞれ機械語に翻訳したあと、1つの実行ファイルにまとめるみたいな流れになるらしい。

この、**ソースコードをそれぞれ翻訳するのがコンパイル**で、コンパイルされたファイル達を**1つの実行ファイルにまとめてあげるのがリンク**。

ビルドっていうのはこの**コンパイルとリンクをまとめて行っている**みたいなイメージでいいのかな。

+ デプロイ

ビルドしてできた実行ファイルを、実行する環境に合わせて、**実際に実行できるようにする**こと。
まあデプロイしたらプレイできるんです。(雑)

インストールとどう違うねん！？！？！？みたいな疑問(僕は持たなかったけど持つ人いるかな)に対する答えとしては、

開発者がデプロイして「準備おっけーだよ」ってあげたやつはネットワーク上で利用できるようになる。例えば ブラウザでできるゲームとか。
インストールっていうのは自分のpcとかにソフトを入れて自分のpcだけで利用できるようにすること

みたいな意味かな

#あとがき
難しかった。なんとな〜くは理解できたかな。説明するのって難しい。
広辞苑とか書いてる人って天才だな。
間違ってたら教えてください。
tkinterで好きなアイコンを付けたい

# アイコンを変えたい
最近GUIアプリをPythonで作るときはTkinterを使っているのですが、アプリを作っているうちに思うことがあります。
**なんか同じアイコンばっかでつまらん**
windowsでいうと、ウィンドウの左上に付いているロゴのことです。使っているライブラリが同じなんだから当たり前の事なんです。でも世の中にあるフリーソフトにはそれぞれ独自のアイコンが使われていて、Tkinterでも同じことが出来ないかと思い今回はTkinterのアイコンを自分の好きなものに変える方法を紹介したいと思います。
（Windowsでは問題なく動作します。MACの方はサーセン）

# アイコン用の画像を用意
はじめにアイコンに使う好きな画像を用意します。今回はこの画像を使います。

![snake.png](https://qiita-image-store.s3.amazonaws.com/0/170520/99ca8bb6-2462-e62c-66cf-3db8b7fddba8.png)


# アイコンを作成
アイコン用の画像を生成するためにicoファイルを作成します。以下のサイトで変換すると楽です。
[favicon.icoを作ろう!](https://ao-system.net/favicon/)

# アイコンを出力
作成したアイコンを実際にGUIの中で使っていきたいと思います。特に何も機能を入れておらず、GUIを出力するだけのサンプルを書きます。

```python

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    iconfile = 'path\\to\\sample.ico'
    root.iconbitmap(default=iconfile)
```

# 出力結果
このように左上に先程用意した画像がアイコンとして出力されました。（何度も言いますが、MACの方まじすんません。）

<img width="152" alt="gui.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170520/9c483b0e-335d-a87c-cdc7-fe52af2b40a7.png">


# 参考
[Embed icon in python script
](https://stackoverflow.com/questions/9929479/embed-icon-in-python-script?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
Javascript関数の引数をDjangoのurl template tagに埋め込みたい

個人的なメモ。

以下のコードのように関数の引数をurlタグに埋め込みたい。
ちなみにmyapp:myviewは数字を受け取る。


```js
function somefunc(num){
   window.location.href = "{% url 'myapp:myview' num %}";
}
```
当然このままではページを開いたときにエラーになる(ページを開いた時点ではnumは不明だからね)。

では文字列の生成をJavascriptにやらせれば良いのか。

```js
function somefunc(num){
   window.location.href = "{% url 'myapp:myview' %}" + num;
}
```

しかし上記のコードはテンプレートを展開するときにurlタグに引数がないのでエラーになる。


ではどうするか。ここに解決方法があった。
[Get javascript variable's value in Django url template tag - Stack Overflow](https://stackoverflow.com/questions/17832194/get-javascript-variables-value-in-django-url-template-tag)

```js
function somefunc(num){
   window.location.href = "{% url 'myapp:myview' 123456 %}".replace(/123456/,num);
}
```
要は、urlタグに仮引数を与えておいて、あとでそれを実物に置き換えてしまえばよい。
なるほど。
Linux版LabViewをインストールする

#はじめに

以前wineを使ってLabViewをLinuxで動かす記事を書いたが、
その後Linux版LabViewの試用版が入手できることを知った。

さらに、この試用版はフル機能で評価期間の制限がないらしい。

インストールに幾つかハマリどころがあるのでまとめておく。

#Linuxディストリビューション

LabViewはrpmで配付されているので、RHEL系のディストリビューションを使う。今回はCentOS7を使う。

alienを使ってUbuntuにもインストールできたが、Visaドライバのカーネルモジュールのインストールができなかった。

#VISAドライバのインストール

VISAのisoをNIのサイトからダウンロードする（要ユーザー登録）

http://www.ni.com/download/ni-visa-17.0/6700/en/

カーネルモジュールを作るので、gccとカーネルソースをインストールしておくこと。カーネルソースは、

kernel-plus-3.10.0-862.el7.centos.plus.src.rpm

のようなパッケージ名である。起動しているバージョンのソースを選んでおくこと。

isoをマウントしてrootでインストールスクリプトを走らせる。

sudo ./INSTALL

ライブラリが足らないと文句を言われたら、32bit版のライブラリ（i686)を追加インストールする。（/lib64ではなく/libの方を見ている）

ライブラリの依存関係が満たされると、Visaのrpmパッケージのインストールがはじまる。

インストールが終わったら、UpdateNIDriversをrootで実行する。

sudo /usr/local/bin/updateNIDrivers

カーネルモジュールのコンパイルが始まる。
しかし、nikalモジュールのコンパイルで失敗するので、ソースを修正する。
/var/lib/nikal/3.10.0-862.el7.centos.plus.i686/nikal/nikal.cを編集する。バージョンに注意。修正は三個所。

`   return do_munmap(mm, addr, len);`

を、

`   return do_munmap(mm, addr, len, NULL);`

と書き換える、また、

`#define NLNIKAL_CMD_SEND     1`
`#define GENL_ID_GENERATE     0`  ＜＜追加

`static struct genl_family nikal_netlink_family =`

と

`#ifdef nNIKAL1400_kHasFamilyGenlOpsGroups`
`   //if ((status = genl_register_family_with_ops(&nikal_netlink_family, nikal_n$` ＜＜コメントアウト
`#else`
`   //if ((status = genl_register_family_with_ops(&nikal_netlink_family, nikal_n$` ＜＜コメントアウト
`#endif`

と修正しておく。

再度 sudo /usr/local/bin/updateNIDrivers を実行すると、nikal, nipalk, niorbkなど10個ほどモジュールが作られるはず。

モジュールのコンパイルが終わったら、visaconfを実行して、問題なく起動することを確認する。

#LabViewのインストール

Niのサイトからisoをダウンロードし、isoをマウントしてインストールスクリプトを実行すると良い。

LabViewのisoにはMacOS版も含まれている。また、Full development とProfessionalの二つのバージョンがあるが、Professionalでのみ、スタンドアロンのアプリがビルドできる。

http://www.ni.com/download/labview-development-system-2018/7419/en/
Rails form_for

## 背景
* form_forの送信先URL（path)とかパラメータの保存先について雰囲気でやっていたのでちょっと調べた
* Railsガイドの写経なので本家を見た方が絶対にいい

## フォームヘルパー

* form_for

```ruby
# params[:person]に値を格納
<%= form_for :person do |f| %>
  <%= f.text_field :name %> # params[:person][:name]に格納
  <%= text_field :age %> # params[:age]に格納
  <%= text_field :person, :gender %> # params[:person][:gender]に格納 
<% end %>

# インスタンスのクラス名のパラメータに値を格納する
# @userのクラスがPostなら、params[:user]に値を格納
# @user.new_record?の結果によってurlを振り分ける（`/users/create` : `/users/:id/update`）
<%= form_for @user do |f| %>
  ...
<% end %>

# パラメータの格納先を指定する
# params[:client]に値を格納
<%= form_for @user, as: :client %>
  ...
<% end %>
```

  * オプション

| オプション | 概要 |
| :---: | :---: |
| :url | フォーム送信先のurlを指定する |
| :namespace | form要素のid属性の衝突を防ぐため、名前空間を定義する |
| :method | フォーム送信時のメソッド。:get, :postが頻出。:post, :patch, :put, :deleteも使える |
| :authenticity_token | ※使い所わかってない |
| :remote | Ajaxでフォームを送信する default: false |
| enforce_utf8 | utf8固定を外す default: true |
| html | html form tagのオプションを指定する |

## 参考
Railsガイド　ActionViewフォームヘルパー　https://railsguides.jp/form_helpers.html
ESLintでgitのブランチ差分をチェックする(Circle CI対応あり)

修正を行った範囲だけESLintでチェックするシェルスクリプトの共有です。
以下のようなケースで有用かと思われます。

* プロジェクトの途中でESLintを導入してエラーや警告を全て潰しきれていない
  - 修正範囲外のエラー、警告がノイズになってしまう状況
* プロジェクトのファイル数が膨大で毎回全てチェックをすると時間がかかる
* git pushの直前にESLintを実行したい

### ブランチ差分実行シェルスクリプト
gitが動かせる環境なら大体bashも動かせるはずなのでbashで記述しています。
このままCircle CIでも動かせます。

```bash
#!/bin/bash

echo 'CIRCLE_BRANCH: ' ${CIRCLE_BRANCH}
TARGET_BRANCH=${CIRCLE_BRANCH}

# masterブランチへのmerge時はチェックしない
if [ "$TARGET_BRANCH" = 'master' ]; then
  echo 'SKIP on merge into master'
  exit 0
fi

# ローカルでの実行用にカレントブランチをセットする
if [ "$TARGET_BRANCH" = '' ]; then
  TARGET_BRANCH=$(git rev-parse --abbrev-ref HEAD)
fi
echo 'TARGET_BRANCH: ' $TARGET_BRANCH

echo 'CIRCLE_BASE_BRANCH: ' ${CIRCLE_BASE_BRANCH}
BASE_BRANCH=${CIRCLE_BASE_BRANCH}

# ローカルでの実行時に環境変数をセットしていない時はmasterブランチと比較する
if [ "$BASE_BRANCH" = '' ]; then
  BASE_BRANCH=origin/master
fi
echo 'BASE_BRANCH: ' $BASE_BRANCH

files=$(git diff --name-only $TARGET_BRANCH $BASE_BRANCH | grep -E '.js$')

error=false
for file in ${files}; do
  ./node_modules/.bin/eslint ${file}
  result=$?
  if [ $result -ne 0 ]; then
    error=true
  fi
done

if $error; then
  exit 1
fi

exit 0
```

`lint.sh` などの名前で保存して利用してください。
実行コマンドは以下のようになります。
`CIRCLE_BASE_BRANCH` にはマージ先のブランチを指定してください。
`CIRCLE_BASE_BRANCH` を省略した場合は `origin/master` と比較します。

#### 実行コマンド例
```bash
CIRCLE_BASE_BRANCH=release201806 ./lint.sh
```
```
./lint.sh
```
Herokuの無料枠でDjangoを継続利用するために、ログを削除してPostgreSQLの行数を節約する


# **DjangoのログがHerokuの無料枠制限を逼迫**
Heroku上にDjangoでWebアプリを作り、計測した温度・湿度データの可視化しているのですが、いつのまにか無料枠のデータ容量の制限（10,000行まで）に引っかかって、アクセスできなくなっていました。
容量制限を考慮して、POSTしたデータの総数が7000個以下になるよう管理していたつもりなのになんで？とPostgreSQLの中身を調べてみると、「`django_admin_log`」というテーブルの行数が4000を超えています。
ノーマークだったのですが、`django_admin_log`は管理画面の操作履歴を保存するテーブルのようです。
とにかく容量制限を回避しなければならないので、`django_admin_log`を削除することにしました。
いろんな方法があると思いますが、取り急ぎ下記２つの方法を試みました。


* PostgreSQLをHeroku経由で直接操作する
* Djangoアプリ内からpythonプログラムで削除する


## **PostgreSQLをHeroku経由で直接操作する**
[herokuのPostgresql row数を圧迫するdjango_admin_logを削除](https://qiita.com/tfuruya/items/e3eab603ed186fe9877a)
全く同じ内容を解決されておられる方がいらっしゃいましたので、参考にさせていだきました。


## **Djangoアプリ内からpythonプログラムで削除する**
定期的に自動削除させたかったので、Djangoアプリから削除する方法を検討してみました。もっといい方法があるかもしれませんが、素人なのでご容赦願います。

### **日時で指定する方法**
LogEntryに「`action_time`」という時刻のカラムがあるので、それでフィルタを掛ければ指定時刻で削除できるようです。

```python
from django.contrib.admin.models import LogEntry
from django.utils import timezone
import pytz

threshold_date = timezone.now()
LogEntry.objects.filter(action_time__lte=threshold_date).delete()
```

### **個数で指定する方法**
`django_admin_log`の個数をチェックし、指定した数より多い場合は削除します。

```python
from django.contrib.admin.models import LogEntry

def DeleteLogsMoreThanLimit(number):
    count = LogEntry.objects.count()
    if count > number:
        models = LogEntry.objects.order_by('-action_time')[:number] 
        LogEntry.objects.exclude(pk__in=models).delete()

DeleteLogsMoreThanLimit(10)
```


## **Djangoの管理画面にログを表示させる**
管理画面にログを表示させるとしたらこんな感じでしょうか。`admin.py`に下記コードを追加すれば良いです。
ただし、管理画面からログを削除しても、「ログを削除した操作のログ」が追加されるので、ログの総数を減らすことはできないと思います。
ログの内容を確認するだけですね・・・。

```python
from django.contrib.admin.models import LogEntry

class LogAdmin(admin.ModelAdmin):
    list_display = ('action_time', 'user', 'content_type')
    list_filter = ['action_time', 'user', 'content_type']
    ordering = ('-action_time',)

admin.site.register(LogEntry, LogAdmin)
```


## **参考にさせて頂きました**
* [各テーブルのRow数確認](https://ameblo.jp/smd310/entry-11377740731.html)
* [heroku上のPostgresqlの操作](https://stackoverflow.com/questions/24939591/how-to-get-tables-from-postgresql-in-heroku)
* [herokuのPostgresql row数を圧迫するdjango_admin_logを削除](https://qiita.com/tfuruya/items/e3eab603ed186fe9877a)
Atomエディターのautocomplete-pathsが"Maximum file count of 2000 has been exceeded"と嘆いたら

こんにちは。相変わらず、平日はwindows7 32bitで苦しみながら開発している@missyyyです。
PhpStormに予算かけられないヨ！ってことで、Atomを使っているわけですが、
開いた当初からエラー吐いていて気づいてなかったのですがちゃんと動いていなかったみたいです。（←気づけ）

ということで今回は、Atom起動時にautocomplete-pathsが"Maximum file count of 2000 has been exceeded"のエラーを出したときの対処法です。サクッと覚え書き程度に説明していきましょう。

## 解決方法

2つあります。どちらもSetting(`Ctrl+,`もしくは`Cmd+,`)からの編集になります。
両方設定してしまってもよいと思います。

### Packagesタブ内のautocomplete-pathsの設定を変える

![img_screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/224562/dca82f83-b3da-5a9c-3f17-3cd24ad52ec4.png)

1. `Packages`タブをポチッと押す
2. インストール済みのパッケージ郡がズラッと出てくるので、autocomplete-pathsを見つけて`setting`ボタンを押す
3. `Max File Count`の項目をデフォルトの2000から**20000**に変更(数値は任意)
4. Atomを再起動させる


以上です。

デメリットとしては起動が0.5秒くらい遅くなったことですが、もはや事あるごとにwin7 32bitさんなので気にしません。


### Core settingのIgnore namesに無視させたいファイルやディレクトリ名を記入
![img_screenshot2.png](https://qiita-image-store.s3.amazonaws.com/0/224562/eec81d47-d282-136b-a800-36cf93cd2a2a.png)

1. `Core`タブを押す
2. Core settingから`Ignore Names`を選択
3. 無視させたいファイルやディレクトリ名を記入(今回は`node_modules`)
4. Atomを再起動させる

以上です。
`node_modules`は開かないのにファイルの数が膨大ですからね。。




### おまけ

お昼ご飯はカップヌードルのシーフード味。
VB→Cache'での関数の呼び出しと、あるID番号のインスタンスを開く

```
cachecommand
```
を用いる。
IDを知らない場合でも、Reader.ReadのあとでIDが分かるので、

```
OpenId(CacheConnection, string)
```

で開ける。

```
        'SQL関数読み出しオブジェクト------------------------------------
        Dim cmd2 As CacheCommand
        cmd2 = User.Main.NewClass1.ByName(cnCache)
        Dim Name_param2 As CacheParameter = New CacheParameter("Field1", CacheDbType.NVarChar) '読みだしたいフィールドの指定
        Name_param2.Value = "" 'ここに検索条件を指定、全検索の場合は""
        cmd2.Parameters.Add(Name_param2) '検索条件をパラメータに追加
        Dim id As String
        Dim d3 As User.Main.NewClass1
        Dim reader2 As CacheDataReader = cmd2.ExecuteReader() '複数データを読み出すインスタンスの生成
        While reader2.Read()
            id = reader2(reader2.GetOrdinal("ID")).ToString()
            d3 = User.Main.NewClass1.OpenId(cnCache, id)
            MsgBox(d3.Field1)
            d3.Close()
        End While

```
javascriptのクリップボードにコピーでめっちゃくちゃ詰まったからメモしとく

#とりあえずコード載せます
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="_nakashimamura" data-slug-hash="vrJqJE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="javascript cripboard copy">
  <span>See the Pen <a href="https://codepen.io/_nakashimamura/pen/vrJqJE">
  javascript cripboard copy</a> by 中村＠ガウチャ (<a href="https://codepen.io/_nakashimamura">@_nakashimamura</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


```html
<input type="text" id="target_text" value="ここにコピーしたい値が入るよね" onfocus="this.select();" readonly>
<button id="copy_btn">コピー</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
	$('#copy_btn').on('click', function() {
		var target = null;
		var p = null;
		window.getSelection().removeAllRanges();
		if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
			target = document.querySelector('#target_text');
			target.contentEditable  = true;
			target.readOnly = false;
		} else {
			p = document.createElement('p');
			p.setAttribute('id', 'target')
			document.body.appendChild(p);
			p.innerHTML = $('#target_text').val();
			target = document.querySelector('#target');
		}
		var range = document.createRange();
		range.selectNode(target);
		window.getSelection().addRange(range);
		document.execCommand("copy");
		if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
			target.contentEditable  = false;
			target.readOnly = true;
		} else {
			document.body.removeChild(p);
		}
		window.getSelection().removeAllRanges();
	});
});
</script>

```


これで一通り動くはず。なんです。
*いいコードじゃないのはわかっているんだ、が・・*

# 何で詰まったのか。。。
いまだ理由はわからないんですけど、発火イベントに`touchstart`を使わず、`click`指定したら無事、私が確認した最新ブラウザたちで動きました。

スマホ対応もかねて、jsで`.on('click',function(){});`ってするときに
スマホなら`touchstart`を、
PCなら`click`を、ってやってたんです。
参考サイト様：[jQueryで、on()にclickとtouchstartを併記したら、スマホでのタップイベントの動作がおかしくなった](https://sakura.monte-verita.biz/3409)

だけど、スマホで一切のコピーが動かない事態が起きたんです。
`touchstart`で発火させたイベントだと、`document.execCommand("copy");`が動かない・・・
**いつもfalseが返ってくる・・・**なんだこれ・・・でした。
理由がわからないけれど、動いたからいいや状態:frowning2::frowning2:


# とりあえずちょっとだけコード説明
iOSと他ブラウザで分けている理由としてはiOS10の改悪アップデートからクリップボードにコピーの制約がめんどくさくなってためです。
いや、長いことjs書いてなかったから本気で無知すぎました。。

詳しくはこちら：[Copy to clipboard using Javascript in iOS - Stack Overflow](https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios) 
EIGO DAYO:disappointed_relieved:

要約すると、

- `input`/`textarea`じゃないとコピー実施できないよ
- `form`タグの外にいる場合は、`contenteditable`属性(編集できること）で
- `readonly`属性(読み込み専用)だったらダメだよ
- コピー対象は選択範囲内にないとダメだよ

って言われたためです。

じゃあ**iOS用の記述だけで動くかな？と思って試したら、firefoxとIE/Edgeが死にました**:innocent::innocent::innocent:

でも以下一行で動くようになったのです・・が・・・

```js
target.select();
```

そうするとどうなったかっていうと、**またiOS safariちゃんがごにょごにょした**んですよ。
それから、結果ああなりました(省略)

ほかのコードの説明に関してはネットに山のように落ちているので、ご参照くださいまし。
かしこ。
VisualStudioからCache`サーバへの接続

自分のCache'サーバはlocalhost:1972がデフォルト。

```
Imports InterSystems.Data.CacheClient
Imports InterSystems.Data.CacheTypes

       'Cache'と接続する方法----------------------------------------
       Dim cnCache As CacheConnection
        Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
               "Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
               "Password = yourpassword; USER ID = youruser"
        cnCache = New CacheConnection(cacheConnectStr)
        cnCache.Open()
        `必要な処理をここに記載
       cnCache.Close()
```
SourceTreeのクローン時にPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password)が発生する

### 前提・実現したいこと
SSH接続にてロリポップのリモート環境で作業を行い、リモートリポジトリを作成しました。
その後、ローカル環境にてGit Cloneを実行した時に以下のようなエラーメッセージが発生しました。
※ただしSourceTreeのみで操作している時のみ発生し、ターミナルで操作する際は通常通りGit Cloneが実行できる。

リポジトリをクローンする際の、ソースURLには、以下を入力している
ssh://SSHアカウント@SSHサーバー:2222リモートリポジトリ（bareリポジトリ）のフルパス
参考：https://lolipop.jp/manual/other/git/

### 発生している問題・エラーメッセージ
Please make sure you have the correct access rights
and the repository exists.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
fatal: Could not read from remote repository.

### 試したこと
こちらを参考に再度SSHキーを作成し、GitHub、GitBucketに登録しましたが、同様のエラーが発生しました。
http://tuki0918.hatenablog.com/entry/2013/05/26/143744

### 解決方法

#### ssh-askpassインストール
Homebrewを使ってssh-askpassをインストール

```
brew tap theseal/ssh-askpass
brew install ssh-askpass
```

### SSH keyを読み込む
コマンドは以下の通り:

```
ssh-add -l
```

### パブリックキーをホストにアップロードする

1. ローカル環境で `~/.ssh/id_rsa.pub` のファイルの中身をコピーする
2. ホスト/サーバー環境で .ssh配下に `authorized_keys` ファイルを配置する 
こんな感じ `/var/www/vhosts/example.com/.ssh/authorized_keys`

[参考](https://jmcouillard.com/blog/sourcetree-2-7-and-osx-authentication-issue)
設定ファイルなしで es5 にトランスパイル

# 背景

kintone の JavaScript カスタマイズ開発において、 IE11 に対応するために es6 （async / await も使用）で書いた JavaScript を es5 にトランスパイルする必要がありました。
このような場合、 webpack + babel を使用するのが現状では一般的かとは思います（実際[プラグインを作成する際は webpack + babel の構成でトランスパイルしています](https://qiita.com/shiroko/items/787b7e2ec6bc0c7faaeb)）が、kintone の JavaScript カスタマイズでは、js ファイルを複数まとめることなく、一つだけしかファイルがないといったケースもあり、そのために `webpack.config.js`や`.babelrc`を作成するのもどうかと思い、設定ファイルなしで es5 にトランスパイルする方法がないかと探しました。

#  設定ファイルなしで es5 にトランスパイルする方法

[facebook/regenerator](https://github.com/facebook/regenerator) を使用します。
bash 環境があることと、 Node.js がインストールされていることが前提です。

## インストール

```bash
$ npm install -g regenerator
```
## トランスパイル

```bash
$ regenerator --include-runtime es6.js > es5.js
```

たったのこれだけです！
Swift 4 JSONをパースする方法

## はじめに
Swift4で、標準ライブラリのCodableプロトコルを使い、
JSONのパース処理を行った。

## 実装
1. Stringのエクステンションを追加

	```swift
	extension String {
	    func decodeJSON<T>(_ type: T.Type) throws -> T where T : Decodable {
	        return try JSONDecoder().decode(type, from: self.data(using: .utf8)!)
	    }
	}
	```

2. エンティティを定義

	```swift
	struct User : Codable {
	    let name: String
	}
	
	struct Group : Codable {
	    let users: [User]
	}
	```
1. 呼び出し元

	```swift
	do {
	    let user = try "{\"name\":\"佐藤\"}".decodeJSON(User.self)
	    let users = try "[{\"name\":\"佐藤\"},{\"name\":\"鈴木\"}]".decodeJSON([User].self) // ←typeは配列型
	    let group = try "{\"users\":[{\"name\":\"佐藤\"}]}".decodeJSON(Group.self)
	} catch {
	    print("解析失敗")
	}
	```
【Swift】 error: error opening input file '〜〜/〜-Bridging-Header.h' (No such file or directory)

#エラー内容
objectie-cからSwiftへ移行後、Bridging-Header.hのファイルを削除。
ビルド時に出たエラー。

```<unknown>:0: error: error opening input file '〜〜〜〜/〜-Bridging-Header.h' (No such file or directory)```
※〜〜〜はBridging-Header.hファイルのパス

#解消方法
Bridging-Header.hの設定の解除を忘れていました。
<img width="684" alt="スクリーンショット 2018-06-15 8.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/186535/122b3b8d-2fad-ef22-8897-c4de2e03b6a4.png">


Build Settingの、Objective-C Bridging Headerに設定していたファイル名を削除したらビルドが通りました。

<img width="694" alt="スクリーンショット 2018-06-15 8.51.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/186535/e7aae0af-d97f-7a88-14de-daaeb3a4f6ef.png">


#その他参考
[SwiftでObjective-CのFrameworkを読み込む方法](https://qiita.com/skatata/items/1facd024d239b9545031)
[Swift：SwiftからObjectiveCのコードが参照できないときのチェックポイントメモ](https://qiita.com/mokemokechicken/items/6716193cfcbd0a4d8b84)
Alexaは審査落ちたが、Googleアシスタントは審査通過したので自分なりに分析する

<a href="https://youtu.be/Q4zqEnHk1Fw"><img src="https://qiita-image-store.s3.amazonaws.com/0/62822/d2a55b6d-cab1-e436-50d9-fb6ae1c54615.png" alt="みんな仲良し" width=300></a>

**「みんな仲良し」** というスキルを作ったのですが、
Alexaは **「もう申請しても無駄です」** と言われてしまいましたが、
Googleアシスタントは **「審査通過」** しました。
その違いを、自分なりに分析しました。


# 問題のスキル
- 「天気を聞いて」とユーザーが発すると、自分以外のスマートスピーカ（Siri/Alexa/GoogleAsistant）に無作為で天気を聞いてくれるスキルです。
- https://assistant.google.com/services/a/uid/0000006ae7c9f994?hl=ja


# 審査の経過
## １回目の申請

#### GoogleAsistant
```
(即日)機能していないです
```

#### Alexa
```
(3営業日過ぎ...)紛らわしいしユーザーが混同してしまう恐れがあります。
```

### どちらもリジェクトされる。
- まあ、そんなもんか。

### 修正する
- **Siriを機能から削除** => Siriの反応が悪すぎて、何も反応しなかった（学習させてないから当たり前だった）ので、削除しました。
- 実質、Alexa＝＞Googleアシスタントに、Googleアシスタント＝＞Alexa に問うようになり、必ず反応するようになった

## 2回目の申請
#### GoogleAsistant
```
(即日)紛らわしいし、ユーザーが混同してしまう恐れがあります。
```

#### Alexa
```
(3営業日過ぎ...)紛らわしいし、ユーザーが混同してしまう恐れがあります。
```

### どちらもリジェクトされる。
- 必ず反応するのに、混同するってことは機能に問題有りなのか...

### 修正する
- 利用規約と遊び方、ジャンルを変更する(以下を追加)
 - みんなが仲良しになれるよう天気を聞いてくれるジョーク系スキルです。
 - ※GoogleHomeからの返答を楽しんでください
 - ※他のスマートスピーカーへの動作は保証しません

## 3回目の申請
#### GoogleAsistant
```
おめでとうございます！！審査通過しました。
```

#### Alexa
```
ユーザビリティー的に、ユーザーに混乱を招く可能性があるぜぇぇぇぇぇ
\\このスキルの再申請はご遠慮ください。//
```

### Alexaはもうだめになってしまった。
- このスキルの再申請はご遠慮ください。という言葉が突き刺さった。くやしい

# Alexaの方が審査はきびしい
- 前回、[「GoogleHome」と「AmazonEcho」を表で比較する](https://qiita.com/okamu_/items/b3ce6c2f720fb8a32c1c#%E8%A1%A8%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%82%8B)という記事を書いてまとめましたが、審査はやはり「まあまあ厳しい」ようです。

# Googleアシスタントの人は優しい
- あまりみていないんじゃないかと思っていましたが、今回のアプリ作成で、FBでアドバイスなどを多くいただきました。こうしたらいいですよなど。なので、意外と見てくれています。数回リジェクトされても、たくさん挑戦しましょう！！！

# 意外と言い回しで解決する場合がある
- 「[チャーハン](https://assistant.google.com/services/a/uid/000000c88c90d59b?hl=ja)」アプリでもそうでしたが、ジョーク系アプリです、や（非公式）など、言い回しなどを工夫すれば審査を通過できる場合があるようです。


# まとめ
- リジェクトされても、言い回しでどうにかなる場合がある
- 審査はわりかし早いので、挑戦し続けた方がいい
- スマートホームアプリ開発は、楽でなんとなく楽しいです
- 興味ある方はぜひ！チャレンジして見てください！
AlibabaCloudのROSからAuto ScalingでECSを起動した後にSSHで接続する方法

# はじめに

[AlibabaCloudのROSからAuto ScalingでECSを起動してみる](https://qiita.com/wa-ta-ru/items/e38e88f96502a51211f9)
の記事で足りない点があります。

今回はそちらに触れたいと思います。
ROSで起動はできてます。

**足りない点それは、サーバにsshログインができません。**

さて何が足りてないでしょうか？

# 足りない点とは？

それは、**KeyPairName**です。
ECSにパスワードを設定はできますが、多く起動したら設定するのは大変ですね。

なぜ、今回は設定がなかったのでしょうか？

[阿里云帮助中心](https://www.alibabacloud.com/help/zh/doc-detail/51203.htm?spm=a2c63.p38356.a3.28.44134371V9NtGA)

[日本語ALIYUN::ESS::ScalingConfiguration](https://jp.alibabacloud.com/help/doc-detail/51203.htm)
や
[英語ALIYUN::ESS::ScalingConfiguration](https://www.alibabacloud.com/help/doc-detail/51203.htm)
のページにはないパラメータが本家にあります。

# ROSテンプレートを下のように変えます。

```json
    "ScalingConfiguration": {
      "Metadata": {
        "GraphicId": "RosGraphicElement-13"
      },
      "Type": "ALIYUN::ESS::ScalingConfiguration",
      "Properties": {
        "SystemDiskCategory": "cloud_ssd",
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "KeyPairName": {
          "Ref": "KeyPair"
        },
        "SecurityGroupId": {
          "Ref": "SG"
        },
        "ImageId": {
          "Ref": "ImageId"
        },
        "InternetMaxBandwidthOut": 1,
        "IoOptimized": "optimized",
        "ScalingGroupId": {
          "Ref": "ScalingGroup"
        },
        "InternetChargeType": "PayByTraffic",
        "InternetMaxBandwidthIn": 200,
        "ScalingConfigurationName": {
          "Ref": "ALIYUN::StackName"
        }
      }
    },
```

# ROSを起動後、ECSにsshで接続します

```shell
[f_prg@Documents] $ ssh root@XX.XX.XX.XX -i ~/.ssh/YYYYYYYYYYYYYY.pem
Welcome to Alibaba Cloud Elastic Compute Service !

[root@iZ6weaorr4gydoa6ohwtx5Z ~]#
```

ということで、ssh接続ができました。\^ o ^/

# さいごに

本家のドキュメントが中国語なので
翻訳ができていると嬉しいところですが
今回はそういった場合の対処方法、調べ方があるということをお伝えしました。
ファイル操作


# テキストファイルの入力
## 1行ずつ読み込む
StreamReaderクラスを使って、テキストファイルを読み込む。

C#プログラミングTips ファイル入出力の基礎
http://www.atmarkit.co.jp/fdotnet/csharptips/005file/005file.html

## 一気に読み込む
FileクラスのReadAllLines静的メソッドを使って、テキストファイルを読み込む。
.NET Framework4以上では、IEnumerableを返すReadLines静的メソッドを使える。

# テキストファイルへの出力
## 1行ずつ書き込む
StreamWriterクラスを使って、テキストファイルへ書き込む。

## 一気に書き込む
FileクラスのWtiteAllLines静的メソッドを使う。
.NET Framework4以上では、IEnumerableを引数で受け取れるWriteAllLines静的メソッドも使える。
C#で確実に変換できるかわからない時は、TryParse と out var を使おう

※ビルトイン値型の話です。`is ` `as`での安全なキャストとは別です。

C#で文字列を数値や日付にキャストする際、確実に変換できる値かわからないことがあります。
かといって`int.Parse`や`DateTime.Parse`を`try {...} catch {...}`すると重いです。

その場合、`TryParse`メソッドが便利です。

## 文字列を数値に変換する

ユーザーの入力を2倍にし表示するコンソールアプリのコードです。

```csharp
var line = Console.ReadLine();
int num;
if (int.TryParse(line, out num))
    Console.WriteLine($"{line}の2倍は{num * 2}です");
else
    Console.WriteLine($"{line}は整数に変換できません");
```

`TryParse`メソッドの直前で変数の宣言を行っています。（`int num;`）
この変数の宣言は以下のようにインライン化することができます。

```csharp
var str = Console.ReadLine();
if (int.TryParse(str, out var num))
    Console.WriteLine($"{str}の2倍は{num * 2}です");
else
    Console.WriteLine($"{str}は整数に変換できません");
```

`out var num`とインラインで宣言できたので直前の変数宣言が消すことができました。

`decimal`や`float`、`double`といった数値型は`TryParse`メソッドを持っているので同様にキャストできます。

## 文字列を日付に変更する

`DateTime`も同様に`TryParse`メソッドを持っています。

```csharp
var line = Console.ReadLine();
if (DateTime.TryParse(line, out var dateTime))
    Console.WriteLine($"変換できました。Year:{dateTime.Year} Month:{dateTime.Month} Day:{dateTime.Day}");
else
    Console.WriteLine("変換できません。");
```

ただ、`DateTime`の`TryParse`では書式設定がありません。
`"2018/06/10"`といった文字列は変更できますが、`"2017年06月10日"`といった文字列はキャストできません。

その場合、`TryParseExact`を使います。

```csharp
using System;
using System.Globalization;
⋮
var line = Console.ReadLine();
if (DateTime.TryParseExact(
    line,
    "yyyy年MM月dd日",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out var dateTime))
    Console.WriteLine($"変換できました。Year:{dateTime.Year} Month:{dateTime.Month} Day:{dateTime.Day}");
else
    Console.WriteLine("変換できません。");
```
MetaMask のネットワーク変更を検知する

# MetaMask の仕様変更
* MetaMask のネットワークを変更したときに、これまではブラウザを自動的にリロードしていたが、自動的にリロードしないようになるとのことです。
  * 詳細: https://medium.com/metamask/breaking-change-no-longer-reloading-pages-on-network-change-4a3e1fd2f5e7
* したがって、 ポーリングで MetaMask に設定されているネットワークを確認する必要が出てくるようになりました。
* なお、どのネットワークが選択されているかについては、ローカルに値がキャッシュされているので、ポーリングしても通信は発生しないとのことです。

# MetaMask のネットワーク変更を検知するプログラム例
* この例では web3.js 0.20.6 を使用

```js
var web3js; // ローカルの Web3 オブジェクトを格納するための変数です。
window.onload = function() {
  if (typeof web3 !== 'undefined') {
    // Mist または MetaMask のプロバイダを使用して Web3 を初期化します。
    web3js = new Web3(web3.currentProvider);
    console.log(web3js.version.api);  // => 0.20.3

    // ポーリングし、使用しているネットワークをチェックします。
    setInterval(function () {
      web3js.version.getNetwork(checkNetwork)
    }, 1000);

    function checkNetwork (err, currentNetwork) {
      if (window.lastNetwork != currentNetwork) {
        alert("Ethereum Network has been changed: " + currentNetwork);
        window.lastNetwork = currentNetwork;
      }
    }
  } 
};
```

# サンプル
* https://piyolab.github.io/playground/ethereum/checkMetaMaskNetworkChange/

# 参考
* https://medium.com/metamask/breaking-change-no-longer-reloading-pages-on-network-change-4a3e1fd2f5e7
* https://scrapbox.io/playground/Breaking_Change:_No_Longer_Reloading_Pages_on_Network_Change
* http://blog.playground.io/entry/2018/05/28/055946

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/MetaMask_のネットワーク変更を検知する
axiosでPOSTしているのにGETとして扱われてしまう

# 概要

axiosでPOSTしているのだが、consoleに以下のようなエラーが出ていたため対応した。



```
GET https://hogehoge 405 ()
```

# 対応方法

axiosで指定するURLの末尾に`/`をつけなければPOSTを指定しているのにGET扱いになってしまった。

`/`をつければ解決


```javascript:良い例

axios.post('/hoge/').then((response) => {});

```

```javascript:悪い例

axios.post('/hoge').then((response) => {});

```
amazon linuxでpythonのNEM開発環境を爆速で整える

NEMの開発環境整えるシリーズ！

php版が出てきたので、python版の環境構築方法をお伝えします。
使うライブラリはtipnem-botでおなじみなむやんさんのnamuyan/nem-pythonです。

ソースコードはこちらにあります。
https://github.com/namuyan/nem-python

ただし、これpython3が必要です。そうです、amazon linuxのデフォルト設定では動きません。なのでpythonのインストールとpip環境を再整備する必要があります。
ここに少しだけテクニックが必要ですが、慣れればあとは大したことありません（うん、どこかで聞いたセリフ？）

まずはおきまりのyum関連

```
sudo yum update
sudo yum install gcc gcc-c++ python36* git -y
```

次にpython のバージョンを切り替えます。

```
sudo alternatives --config python

  選択       コマンド
-----------------------------------------------
*  1           /usr/bin/python2.7
 + 2           /usr/bin/python3.6
```

ここで2を選択

次にamazon linuxに標準で入っているpip9を削除します。
ここは時代に合わせてバージョンを置き換えてください。
（コアな部分から実行ファイルを削除するのでここからは自己責任です）

```
sudo rm -rf /usr/lib/python2.7/dist-packages/pip-9.0.3.egg-info
sudo rm -rf /usr/bin/pip*
```

pip10 をインストールします。
僕の好みですが、ユーザーレベルでインストールします。
将来的にポート80でサーバを立てたい方は管理者権限でインストールした方がよいかもしれません。

```
mkdir downloads
cd downloads
wget "https://bootstrap.pypa.io/get-pip.py"
python get-pip.py --user
pip install --upgrade pip --user
cd ..
```

nem_python の開発環境を整えます。

```
mkdir python_app
cd python_app/

git clone --depth 1 https://github.com/namuyan/nem-python.git
cd nem-python/

pip install requests --user
pip install nem_ed25519 --user
pip install bjson --user


```

これで準備は完了です！さあ、実行してみましょう！

```
python

Python 3.6.5 (default, Apr 26 2018, 00:14:31) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>>from nem_python.nem_connect import NemConnect
>>>nem = NemConnect(main_net=True)
>>>nem.get_account_info(ck='NCR2CQE6AI3DIRHPHEPBSVDBOQFSHXFSQF4NIUAH')
{'meta': {'cosignatories': [], 'cosignatoryOf': [], 'status': 'LOCKED', 'remoteStatus': 'INACTIVE'}, 'account': {'address': 'NCR2CQE6AI3DIRHPHEPBSVDBOQFSHXFSQF4NIUAH', 'harvestedBlocks': 32, 'balance': 133529613776, 'importance': 2.6266994070564825e-05, 'vestedBalance': 130540323012, 'publicKey': 'a7d9eec00e192cdb82df471a7804974c85ba282f7f4272ec5a5dc8f640f267d3', 'label': None, 'multisigInfo': {}}}
```

取れましたね。この記事書きながら15分ぐらいで環境構築が終わりましたね。

基本的な使い方はここに書いてあります。
https://github.com/namuyan/nem-python/blob/master/doc/BASIC-USAGE.md

もちろんトランザクションの発行も可能ですので、今まで培ってきたpythonのノウハウがそのままNEM開発に使えます。

何かできたらまた教えてくださいねー。
それでは！
`rails s`で サーバーが起動せず、Rails の Usage がでるだけ

Railsプロジェクト内で、`rails s`を実行したところ、サーバーが起動せず、以下のような `Usage` がでるだけという現象に遭ったんでメモ。

```
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]            # Skip namespace (affects only isolated applications)
  -r, [--ruby=PATH]                                        # Path to the Ruby binary of your choice
                                                           # Default: /Users/tokio/.rbenv/versions/2.4.1/bin/ruby
  -m, [--template=TEMPLATE]                                # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE] 
 
...hogehoge

```

以下を実行したらなおった。

```
bundle exec rake rails:update:bin
```

自分の場合は、 `development` 環境でごちゃごちゃしたかったんで、一応以下のようにオプションつけてやった。

```
bundle exec rake rails:update:bin RAILS_ENV=development
```
npmjs.com の `npm i *` を `yarn add *` でコピーできるようにする Chrome 拡張

[コイツ](https://chrome.google.com/webstore/detail/replace-npm-i-by-yarn-add/cacbmpinjlnlhbgigcajgllkgneegnec)をインストールします。

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/84144/27286477-27f2-5848-3827-8764a3250244.gif)

何気に`-D`付けてコピーしたい時も多いので、`d`キーを押してる間`-D`が付くようになってます。

---

>
repo: https://github.com/nju33/chrome-replace-npm-i-by-yarn-add
インストールしたはずのDroidcamにエラー

##Droidcamが急に使えなくなった

>droidcam device not found did you install it

このようなエラーメッセージが出てくるようになり、起動しなくなったので修正方法をまとめようと思う。
まずはすぐに[こちら](https://ubuntuforums.org/showthread.php?t=1576797)のサイトが出てきました。

とりあえず、こまったときにアップデートをしてみます。

```
sudo apt-get update
```

これではうまく改善されなかったので、もう一度入れなおしてみることにします。
とりあえず[こちら](http://ubuntuhandbook.org/index.php/2016/12/install-droidcam-ubuntu-16-04/)のサイトが参考になると思います。

もう一度インストールをし直したらうまくできました。

##今後の課題
今回はアンインストールをせずにあらたにインストールしたがこれによってどのような問題が発生するのか？
undefined method `format_posted_time'のエラーについて

<h2 id="Rubyの開発者を目指し基礎を学んでいる:relaxed:">Rubyの開発者を目指し基礎を学んでいる:relaxed:初心者の私が知識をまとめてみました。</h2>


<h3><strong>やったこと：</strong></p>
<ul>
<li>エラー対応</li>
</ul>


<h2>
<span id="code---コードの挿入" class="fragment"></span><i class="fa fa-link"></i>問題：NoMethodError in Messages#index:thinking:</a>
</h2>
<p><strong></strong></p>

<ul>
<li>ビューを編集していたらエラーが、、、メソッドがないらしい。</li>
</ul>

<h3>
<span id="code---コードの挿入" class="fragment"></span><i class="fa fa-link"></i>
</h3>

実際のエラー文です。

```bash:
Showing /Users/~~/app/views/messages/_message.html.haml where line #6 raised:
undefined method `format_posted_time' for #<#<Class:0x007f85257cc2a0>:0x007f8529f48cf0>
```
こちらがスクリプトの抜粋

```bash:
= message.user.name
.upper-message__date
= format_posted_time(message.created_at) #どうやらここに問題あり
.lower-meesage
- if message.content.present?
%p.lower-message__content
```

<p>といった具合で、`format_posted_time'というヘルパーメソッド、ないらしいです。:head_bandage:</p>
ここまでたどり着くのに1hくらいかかりました。

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href= "http://railsdoc.com/references/strftime"><i class="fa fa-link">解決：strtime(ヘルパーメソッド)で対応</i></a>
</h2>


ヘルパーメソッドが存在しないためstrftimeで対応(直接記述した。)

```bash:

    = message.created_at.strftime("%Y/%m/%d %H:%M”)
```

<p>今回は強引に日付フォーマットを作成しましたがおそらくもっと良いヘルパーメソッドもある（はず）でしょう。探してみます。</p>

<p>
<h2>
<span id="code---コードの挿入" class="fragment"></span><i class="fa fa-link"></i>
to be continued...
</h2>
</a></h2>
<li id="fn2">
</a>エラーにかける時間を短くしていきたい。:expressionless:</p>
</li>
RubyとPHPの基本動作比較　変数と配列

RubyとPHPを勉強していて、同じ動作をするコードがごちゃ混ぜになってしまったので、
比較しながら書いていくことにしました。

#変数
###1：変数nameにmarioという値を代入し、出力させる
【Ruby】

```rb
name = "mario"
puts name
```

【PHP】

```php
<?php
$name = 'mario';
echo $name;
?>
```

###2：変数同士を連結させ、mario31と出力させる
【Ruby】

```rb
name = "mario" age = 31
puts name + age
```

【PHP】

```php
<?php
$name = 'mario';
$age = 31;
echo $name.$age;
?>
```

###3：上記の変数を変数展開して「私はmarioです。31歳です。」と出力させる
【Ruby】

```rb
puts "私は #{name}です。#{age}歳です。"
```


【PHP】

```php
<?php
echo "私は{$name}です。{$age}歳です。";
?>
```

##条件分岐
####1：点数が80点以上だった時「よくできました」、60点以上で「まぁまぁ」、それ以下で「がんばりましょう」と出力させる
【Ruby】

```rb
score = ○○
if score > 80
puts "よくできました"
elseif score > 60
puts "まぁまぁ"
else
puts "がんばりましょう"
```

【PHP】

```php
<?php
$score = ○○;
if ($score > 80){
echo 'よくできました';}
elseif ($score > 60){
echo 'まぁまぁ';}
else {
echo 'がんばりましょう'}
?>
```

※論理演算子&&と||は同じ使い方

####2：if文の分岐が多い時、Rubyではcase文、PHPではswitch文で書くことができる
【Ruby】

```rb
case ○○
when 1 then
puts "1が入力されました"
when 2 then
puts "2が入力されました"
when 3 then
puts "3が入力されました"
else
puts "それ以外です"
end
```

【PHP】

```php
<?php
switch ($number) {
case 1:
echo '1が入力されました';
break;
case 2:
echo '2が入力されました';
break;
case 3:
echo '3が入力されました';
　break;
default:
echo 'それ以外です';
break;
}
?>
```

##配列
###1：基本の配列
【Ruby】

```rb
names = ["hanako","taro","mario"]
puts names
puts namess[0]
```

【PHP】

```php
<?php
$names = array('hanako','taro','mario');
echo $names;
echo $names[1];
?>
```

###2：Rubyのハッシュ、PHPの連想配列
【Ruby】

```rb
user = {"name" => "mario,"age" => 31}
```

or

```rb
user = {:name => "mario",:age => 31}
```

↓置き換えることができる

```rb
user = {name:"mario",age:31}
puts user[:name]
```

※配列の要素にハッシュを入れる場合

```rb
users = [
{name:"mario",age:31},
{name:fujisaki,age32}
]
puts users[0]
```


【PHP】

```php
<?php
$user = array(
'name' => 'mario',
'age' => 31
);
echo $user['name'];
?>
```

ひとまず変数と配列についてはここまで！
RubyとPHPで同じワードを使うことがありますが、
書き方が違ってくるので間違えないようにしていきたいです。

次は繰り返し文について書いていきます！
gitコマンドを効率的に扱おう！！ git-completion.bashの導入法！！

##はじめに
gitのコマンドを補完してくれる`git-completion.bash`を知ったので導入します!!
参考Qiita:https://qiita.com/panti310/items/9e266a2913a8558f4679

## 導入
```
sudo find / -name git-completion.bash
/home/users/.oh-my-zsh/plugins/gitfast/git-completion.bash
/home/users/.zgen/robbyrussell/oh-my-zsh-master/plugins/gitfast/git-completion.bash

vim ~/.zshrc
```

```.zshrc
plugins=(
  git
  git-completion.bash
  zsh-syntax-highlighting
)
```

```
source ~/.zshrc
```

基本的なコマンドの補完はできたけど、ブランチとかは補完できない・・・

## 導入その２
```
cp /home/users/.oh-my-zsh/plugins/gitfast/git-completion.bash ~/.git-completion.bash
source ~/.git-completion.bash
```

できた！！

## それでもできない・・・
- そもそもbranchはある？
`git branch`で確認してみては？

##参考資料
- https://qiita.com/panti310/items/9e266a2913a8558f4679
Blender超初心者がハマったことを書く 

最初に。この記事は書きかけです。知見が深まったらきれいにまとめようと思っています。メモ代わりなのでとっ散らかっていますがご容赦ください。

# Blenderとは。

フリーの3DCGオーサリング＆レンダリングソフト。詳しくは
[ Blender - Wikipedia](https://ja.wikipedia.org/wiki/Blender)
この辺とか見てください。3DCG関連のいろいろなことができますが私は現在Unity用のモデルを作るのに使っています（なので今回はモデリングの話しか出てきません）

# 全く初めての人へ

* ティーカップを作ろう
[Blender Tutorial For Beginners: Coffee Cup](https://www.youtube.com/watch?v=y__uzGKmxt8)

この動画である程度操作感はつかめると思います。英語ですが多分雰囲気で分かるでしょう。操作が早くてついていけない場合、YouTubeの設定から再生速度を落とすと良いです。

操作いろいろ。最初に目を通すと良いかも
http://riotoqll.hatenablog.com/entry/2014/02/10/162604

バージョンがちょっと古いので最新画面の表示と少し違いがありますがなんとかなります。

# ハマりどころ

## 窓にフォーカスがある。
お絵かきに関することはお絵かき窓の中にカーソルを持っていかないと動かないことがあります。

## 編集モードがいくつかある
モデリングで主に使うのはEdit ModeとObject Mode。モードによって出来る操作が違うので最初のうちは「うごかねえ！！」ということが多発します。操作不能に陥ったらモードを確認しましょう。画面下の方にプルダウンがあります。```tab```キーでも切替可能です。

## 編集するものが何もない時はEdit Modeが選択できない
「Edit Mode」モードは画面に最低1つオブジェクトがないと選択できません。「Create」から板切れでも何でもいいので表示させると変更できるようになります。板切れは後で消せば良いです。

＃デフォルトで最初にぽつんと立方体が置いてあるのはそのためかな？

## オブジェクトの選択モードが3つある。
「Edit Mode」には「点モード」と「辺モード」と「面モード」の3つがある。「Edit Mode」とかのプルダウンの右側にわかりにくいアイコンが3つあって切替可能。「Object Mode」の時は隠れるので注意。「点モード」は選択した点の隣接する辺にグラデーションがかかるので分かる。「辺モード」は選択した辺にグラデーションがないので分かる。「面モード」は選択した面が塗り潰されるので分かる。

## 選択解除が面倒
何もないところをクリックするとかでは勝手に選択解除してくれないみたいなので、```a```キーを押して全選択して、もう一度```a```キーを押して全選択解除しています（良い方法があったら教えてください）。要は一部選択状態から全選択解除したかったら```A```を2回連打しています。

逆に考えると複数選択は何も考えなくてもできるので楽なのかもしれない（まだ慣れない）

## 選択が右クリック。
なんでそうしたし。一応設定で変えられると思うが何か理由があるんだろうから甘んじてそのままにしています。

## オブジェクトをドラッグしても動かない
選択したオブジェクト近辺に表示される色付きの矢印みたいので3軸方向に動かせます。表示されない時は「Object Mode」になっていないか確認

## 閉じた線と面は違う
これはBlender特有の問題ではないが、閉じた線を面にするには、面にしたい辺（あるいは頂点）をすべて選択して「F」キーを押そう。閉じた線だけでなく、適当な線分を複数選んでもいい感じに面にしてくれる。なお複数の点を選んで「F」を押すと線にしてくれる。この辺の操作感は直感的でいい。

## ビューから見えない奥側の点や辺が選択できない

隠れている頂点が選択できないモードがあります。
下側のメニューに項目があります。スクリーンショットがないと分かりにくいので追記予定

## 鏡像の中心がどこかわからない

鏡像（ミラーリング）がうまくいかないときはオリジン（オブジェクトの基点、黄色い小さな円）がずれている。オリジンは```Ctrl+Shift+Alt+C```という嫌がらせとしか思えないショートカットで移動できる。もうちょっと簡単な方法がありそうなので分かったら追記する。

## 法線が勝手にずれる

いまのところ原因不明。

ポリゴンの世界では、本来平面に垂直であるべき法線をずらす（！）ことでポリゴンへの光の当たり方を変えることができます。で、この法線が勝手にずれることがありました。

ポリゴンの一部だけ色がおかしい場合、法線がずれている可能性があります。

大抵の場合、```a```キーで全選択して```Ctrl```+```n```を押すといい感じに自動計算してくれます。

## コツ

* 最初のうちは目的物に似たオブジェクトを置いて、必要に応じて面を増やしていく感じでモデリングすると楽かも（チュートリアル動画を見ていると、何もないところからいきなり細部のポリゴンを描いていく派の人もいるようです）
* 訳がわからなくなったらとりあえず「ESC」を押してメインビューで「A」連打。


コーヒーカップの作成
https://www.youtube.com/watch?v=y__uzGKmxt8
ローポリゴン犬の作成
https://www.youtube.com/watch?v=pkvMiEeJGro

顔の作成
https://www.youtube.com/watch?v=wm3lQV_fn0A

下絵（トレース用）の貼り方
https://blender-cg.net/background-images/
Bootstrap ver 4.1 3.0でのoffsetの扱い

# あれ？offsetが効かないんだけど・・・？
どうも、ClojureのLuminusフレームワークを使ってWeb開発をしている学生です。
いつものように hiccup で

``` clojure
(defn home-page []
  [:div.container ;; コンテナを作って
   [:div.row.justify-content-center ;; row を作って
    [:div.col-md-4.col-sm-offset-4 ;; 12等分して左4つを空けてそこから4つ分のところに
     [:button.btn-primary "Login"]] ;; button を置いてください
    ]
   ])

```
として、html側で

``` html

<div class="container">
 <div class="row justify-content-center">
   <div class="col-md-4 col-md-offset-4">
     <button class="btn-primary">Login</button>
   </div>
 </div>
</div>
```

としてうまく動くかなーと思ったんですが、うまくセンタリングされませんでした。
結論から言うと、**Bootstrap のバージョンを確認しろ** 、ということです。

# Bootstrap ver 3.0

上のコードでセンタリングされるようです。

# Bootstrap ver 4.1

`col-md-offset-4` を `offset-md-4` としましょう。

# 具体例 (Bootstrap ver 4.1)

``` clojure 
(defn home-page []
  [:div.container
   [:div.row.justify-content-center
    [:div.col-md-4.offset-4
     [:button.btn-primary "Login"]]
    ]
   ])
```

``` html
<div class="container">
  <div class="row justify-content-center">
    <div class="col-md-4 offset-4">
      <button class="btn-primary">Login</button>
     </div>
  </div>
</div>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147520/196d6e1f-fa45-b706-632b-05e28a0fdec8.png)
Anaconda仮想環境でcondaコマンドが使用できない

## 状況  
- Anacondaインストール済み
- python動作確認済み
- Anaconda Navigatorを起動し、createにて仮想環境を作成しても、ライブラリが少ない。  
結果、condaコマンドすら使えない。  
例）```(仮想環境名) C:\WINDOWS\system32>　conda list```  
=> ```EnvironmentLocationNotFound: Not a conda environment:```
- Anaconda Navigatorを起動し、Anaconda関連のパッケージをマニュアルで選んでインストールしても、上記のコマンドを実行しようとすると、同じエラーが出る。

## 解決法

1. Anaconda Promptを**管理者権限**で起動。
2. (base) で```conda create --name (仮想環境名) anaconda```を実行。
3. 途中`(y/n)`の選択を問われるので、`y`を入力。  

## まとめ
原因不明だが（おそらくpipでのインストールを併用したため？）anacondaにて作成した仮想環境のパッケージが少なく、condaコマンドが使用できなかった。解決法を実行後は`conda list`、`conda install XXX`等のcondaコマンドが使用できるようになった。
NginxでPHPを動かす際にいじった設定ファイル

# このエントリの目的
 - 設定ファイルがどこにあるのかのメモ

# 環境
PHP7.2系（2018年6月15日現在最新の7.2.6）
CentOS 7.5
webサーバ **nginx**

# NginxでPHPを動かすにはPHP-FPMを導入する必要がある
- PHP7.2系のPHP-FPMは「**php72-php-fpm**」という名前が正解  
→ NginxでPHPを動かす系の記事に出てくるものの大半はこれに当てはまらない。  
（設定ファイルの位置等が異なる）  
（例）**PHP-FPMの起動**  
`systemctl start php72-php-fpm`


# 設定ファイルの場所
`/etc/nginx/conf.d/default.conf`
ドキュメントルートの設定をしました。

▽参考
[nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定  - インフラエンジニアway - Powered by HEARTBEATS](https://heartbeats.jp/hbblog/2012/04/nginx04.html)

`/etc/opt/remi/php72/php-fpm.d/www.conf`
nginxとphp-fpmとの通信のために変更を加えました。（要勉強。自分が理解できていない。）
unixドメインソケットの設定をしました。（こちらも理解できておらず。）

▽参考
[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc#nginx-%E3%81%A8-php-fpm-%E3%81%AE%E9%80%9A%E4%BF%A1%E3%81%AE%E8%A8%AD%E5%AE%9A)

**※ソケットファイルがつくられる場所**
（これに関しては、ディレクトリがなければつくらないとファイルが自動生成されない）
`/var/run/php-fpm/php-fpm.sock`

# 消える /var/run/php-fpm を回避する
OSを再起動すると、該当ディレクトリが消えてしまうため、下記のようなエラーが出ます。

```nginx
ERROR: unable to bind listening socket for address '/var/run/php-fpm/php-fpm.sock': No such file or directory (2)
```

対応策として
`/etc/tmpfiles.d` 以下に`php-fpm.conf`（名前は何でも良いらしい）といった設定ファイルを設置して回避します。

▽参考
[お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ](https://qiita.com/suemoc/items/e29285e8e67263298f35)
デシル分析をパレート図で試す

# デシル分析
デシル分析は、大量のデータの概要を把握するために利用する。 とある変数でソートし、上位からグループを割り振り、レコードを10分割する。

格差を調べたりするときに利用される。

# コード
https://gist.github.com/tamanobi/832911be9c6ac433cf2aad891bc11c0f
【Go】基礎文法(1)

タダです。

ドットインストールのGo文法を学んでいるのでそこで学んだことを記録していきます。


# 基本データ型
## 文字列型(string)
ダブルクォーテーションで囲んで表現する

```
a := "hoge"
```

## 数値型(int)
整数を表現する

```
a := 10
```

## 浮動小数型(float64)
小数点を含む整数を表現する

```
a := 10.2
```

## 真偽値(bool)
falseかtrueを表現する

```
var a bool
```

## Null(nil)
Nullは

## 書式つきデータ出力
書式つきのデータ出力は、Printfで表現する

```
package main

import "fmt"

func main() {
	a := 10
	b := 12.3
	c := "hoge"
	var d bool
	fmt.Printf("a: %d, b:%f, c:%s, d%t", a, b, c, d)

}
```

# 定数
変数のようにデータを可変にさせず固定にしたい場合に使うのが定数
定数は、constで使う

```
const name = "tada"
```

他には、iotaという識別子もある
これは、const内で定義する、型なしの連続する整数定数を表す

# 演算
## 数値の演算
数値の演算は、「+, -, *, /, %」で表現する
+ : 加算
- : 減算
* : 乗算
/ : 割り算
% : 余り

## 文字列の連結
文字列の連結は、＋で表現する

```
s := "hello" + "world"
```

## 論理値の演算
論理値の演算は、「AND(&&),OR(||),NOT(!)」で表現する


iotaは難しい。。

# 参考
http://blog.kaneshin.co/entry/2016/12/29/153232
初心者？？のためのプログラミング学習サイト

勉強しましょ〜（＾＾；；

１：ドットインストール
https://dotinstall.com/

２：TechAcademy
https://techacademy.jp/

３：Progate
https://prog-8.com/

4:Udemy
https://www.udemy.com/
もっともお世話になっているサイト、プログラミング以外にも色々動画で教えてくれます。有償ですが、定期的に割引されているのでその時が受講するチャンス（＾＾；；
webpack-dev-serverを使って環境変数NODE_ENVを上書きする方法





https://qiita.com/akirakudo/items/77c3cd49e2bf39da79dd
こちらを参考にさせていただきました。
ありがとうございます。


ローカル環境ではwebpack-dev-serverを使用しています。
環境変数使うためにcross-envをインストールしています。
https://www.npmjs.com/package/cross-env


実行コマンド
```
npm cross-env NODE_ENV=local webpack-dev-server
```
webpack.config.js
```
console.log(process.env.NODE_ENV);
```
結果は
NODE_ENV=development
となってしまう。


解決策

webpack.config.jsに
DefinePluginを用いてNODE_ENVを上書きする
https://webpack.js.org/plugins/define-plugin/

webpack.config.js
```
  plugins: [
      // webpack-dev-serverを使うとNODE_ENVがdevelopmentになってしまうため、
      // NODE_ENVを指定した値で上書きする
      new webpack.DefinePlugin({
          'process.env': {
              'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
          }
      }),
  ],
```



こうすると
NODE_ENV=localで出力されるようになった
‌
Rubyで言語処理100本ノック 第2章: UNIXコマンドの基礎 (14 ~ 16)

[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。

今回は、テキストファイルから指定した範囲の行数を取得・分割する処理です。

# 14. 先頭からN行を出力
>自然数Nをコマンドライン引数などの手段で受け取り，入力のうち先頭のN行だけを表示せよ．確認にはheadコマンドを用いよ．

``` ruby:Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)

n = ARGV[0].to_i

puts lines.slice(0...n)
```
``` shell:shell
head hightemp.txt
```
N = 10　の場合

``` shell:結果
高知県	江川崎	41	2013-08-12
埼玉県	熊谷	40.9	2007-08-16
岐阜県	多治見	40.9	2007-08-16
山形県	山形	40.8	1933-07-25
山梨県	甲府	40.7	2013-08-10
和歌山県	かつらぎ	40.6	1994-08-08
静岡県	天竜	40.6	1994-08-04
山梨県	勝沼	40.5	2013-08-10
埼玉県	越谷	40.4	2007-08-16
群馬県	館林	40.3	2007-08-16
```
headコマンドは、-[数字]というオプションを指定することで任意の行数を指定できるそうな。

``` shell:例
head -5 hightemp.txt
```

# 15. 末尾のN行を出力
> 自然数Nをコマンドライン引数などの手段で受け取り，入力のうち末尾のN行だけを表示せよ．確認にはtailコマンドを用いよ．

``` ruby:Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)

n = [ARGV[0].to_i, lines.length].min
exit if n == 0

puts lines.slice(-n..-1)
```

tailコマンドも、-[数字] オプションで行数指定できるんですね。

``` shell:shell
tail -5 hightemp.txt
```
``` shell:結果
埼玉県  鳩山    39.9    1997-07-05
大阪府  豊中    39.9    1994-08-08
山梨県  大月    39.9    1990-07-19
山形県  鶴岡    39.9    1978-08-03
愛知県  名古屋  39.9    1942-08-02
```

# 16. ファイルをN分割する
>自然数Nをコマンドライン引数などの手段で受け取り，入力のファイルを行単位でN分割せよ．同様の処理をsplitコマンドで実現せよ．

``` ruby:Ruby
file_name = "hightemp.txt"
lines = File.readlines(file_name)

n = ARGV[0].to_i

lines.each_slice(n).each_with_index do |line, i|
  File.open("split_hightemp_#{i}.txt", "w") { |file| file.puts line }
end
```
N = 5 の場合
-l オプションで行数を指定しました。

``` shell:shell
split -l 5 hightemp.txt
```

本日はここまでー！
[小技] Linux ホスト名変更までの3ステップ

今回は、Linuxサーバにログインしたあとのホスト名の変更までの3ステップを記載していきます。

```bash
[ユーザ名@ホスト名]$ 
```

####前提知識
・ホスト名を確認するには「hostname」コマンドを利用します。仮にホスト名が「hoge」だとします。

```bash
 [ユーザ名@ホスト名]$ $hostname
hoge
```
となります。
また、この「hostname」コマンドを利用してホスト名を変更できますがサーバさい


####１ステップ
まず、「/etc/host」を修正します。ここではホスト名を「hoge」と変更したいと思います。

```bash:/etc/host
127.0.0.1  localhost.localdomain localhost hoge
```

####2ステップ
次に「/etc/sysconfig/network」を修正します。下記の2つを追加してください。

```bash:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hoge
```

####3ステップ
最後に「/etc/rc.d/init.d/network」を再起動します。

```bash

$ /etc/rc.d/init.d/network restart
```

再起動が失敗する場合などは、プロセスを「kill -9 "PID"」などでkillしてください。

以上です。