OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでAndroidアプリをビルドする

# 準備
・SDK、JDKをインストールしておく。
・Google USB Driverをインストールしておく。

# パスの設定
まず、SDKとJDKのパスを設定します。
![edit.png](https://qiita-image-store.s3.amazonaws.com/0/311225/ebfe911b-4821-5307-1ddb-2ccdacee3fda.png)
Edit＞Preferences を選びます。
![tool.png](https://qiita-image-store.s3.amazonaws.com/0/311225/cd9d1c61-0d6e-35d9-9544-5bf3fb5f4255.png)
External Tools欄を選んで、赤枠内にパスを設定します。
![tool2.png](https://qiita-image-store.s3.amazonaws.com/0/311225/f632f26f-5f51-31fc-4037-0c3ed81c0a96.png)
IL2CPPを使う場合はNDKも必要らしいのですが、まだよくわかりません……
とりあえず、まだ設定していません。

# ビルド設定
File＞Build Settings を選びます。
![set1.png](https://qiita-image-store.s3.amazonaws.com/0/311225/b490d9e5-7eaf-42ff-eb80-77c21599c7a4.png)
PlatformのAndroidを選択して、左下のSwitch Platformを押します。
もしAndroid Build Supportがインストールされていなければ、インストールボタンがあるので押します。

次に、Player Settingsを押します。
![set2.png](https://qiita-image-store.s3.amazonaws.com/0/311225/bf9fcd1e-7b3d-126f-0b43-0b1bac22a24b.png)
Company NameとProduct Nameを入力します。
![set3.png](https://qiita-image-store.s3.amazonaws.com/0/311225/c4c28632-d0eb-5624-dc5b-8b0865c90851.png)
次に、Other Settings内のPackage Name欄を入力します。
「com.(Company Name).(Product Name)」で設定します。

他にもいろいろ設定できそうです。

# 実行
後はBuild And Runを押して実行です。
RailsでI18n.localeを書き換えていたらたまに言語設定がバグる問題に遭遇した

# RailsでI18n.localeを書き換えてたらたまに言語設定がバグる問題に遭遇した

他のユーザー(:en)で画面を参照したあとに元のユーザー(:ja)で画面を見ると、稀にlocale=:enで画面が表示されてしまうという問題に遭遇しました。

実装はこんな感じ。

```ruby
class HogeController < ApplicationController
  before_action :set_locale

  def set_locale
    I18n.locale = current_user.locale || I18n.default_locale
  end
end
```

https://railsguides.jp/i18n.html#リクエスト間でロケールを管理する

Railsガイドでもだいたいおんなじ感じのコードが乗ってる。ApplicationControllerに書いて全コントローラーに継承させるのならこれでもいけるんですが、継承されないコントローラーにアクセスした場合に他のユーザーが設定したロケールになってしまう事があった。

https://github.com/rails/rails/pull/34356

こんなPull RequestもありI18nはスレッドセーフだと言っていますが、
スレッドセーフなだけで、after_actionとかで元の言語に戻しておいてあげないと次に同じスレッドを使ったときに変更されたままの言語が使われてしまうといった感じなんだと思われます。
(違うコントローラーなどでset_localeが実行されない場合に起こる)

こんなふうに実装を変えたら解消しました。

```ruby
class HogeController < ApplicationController
  around_action :set_locale

  def set_locale
    locale = current_user.locale || I18n.default_locale
    I18n.with_locale locale do
      yield
    end
  end
end
```

`I18n.with_locale` を使うことにより、ロケールの変更をアクション実行時に限定しました。
`after_action` でもとに戻すでも行けると思いますが、こっちのほうがドヤり感が高い。

around_action 初めて使った。
SQLAlchemy-migrateでスキーマ変更する方法

# 概要
　今やっている開発にSQLAlchemy-migrateを使用していて、本番環境での運用が始まった後、カラムを変更しようと思った時にやり方が分からなかったので調べました。

# 動作環境
- Debian 9.7
- python 3.6.0
- MySQL 5.7
- SQLAlchemy 1.2.18
- sqlalchemy-migrate 0.12.0
- mysqlclient 1.4.2

# 内容
### カラム追加
　`create`メソッドで新規カラムを作成できます。
　引数には追加したい`Table`オブジェクトを指定します。
　どうやらカラムの追加位置は指定できないようなので、一番後方の列に配置されるみたいです。

  ```python
  from sqlalchemy import *
  from migrate import *
  from sqlalchemy.dialects.mysql import VARCHAR

  def upgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      Column('new_column', VARCHAR(255)).create(mytable)

  def downgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      mytable.c.new_column.drop()
  ```


### カラム削除
  `drop`メソッドでカラムを削除できます。
  カラム追加とは違い、`Table`オブジェクトの`c`メソッドから削除したいカラム名を指定しています。

  ```python
  from sqlalchemy import *
  from migrate import *
  from sqlalchemy.dialects.mysql import DATETIME

  def upgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      mytable.c.new_column.drop()

  def downgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      Column('new_column', VARCHAR(255)).create(mytable)
  ```

### カラム変更
  `alter`メソッドで既存カラムの内容を変更できます。
  削除同様、`Table`オブジェクトの`c`メソッドから変更したいカラム名を指定しています。

  引数には以下項目が指定できます。

  - **name - カラム名**
  - **type - データ型**
  - **default - デフォルト値**
  - **nullable - NULL許可**
 
  ```python
  from sqlalchemy import *
  from migrate import *
  from sqlalchemy.dialects.mysql import VARCHAR, DATETIME

  def upgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      mytable.c.new_column.alter(name='mod_column', type=DATETIME, default='デフォルト値', nullable=True)

  def downgrade(migrate_engine):
      meta = MetaData(bind=migrate_engine)
      mytable = Table('mytable', meta, autoload=True)
      mytable.c.new_column.alter(name='new_column', type=VARCHAR(255), nullable=False)
  ```

# つぶやき
　`downgrade`を整合性がとれるように書かなきゃいけないのはちょっとめんどくさいかも・・・
Qiita APIのOAuth認証は一筋縄ではいかない

## きっかけ

Qiita API で遊んでみようと思い、OAuthのライブラリを使ってサクッと認証をしようと試みましたがうまくいきませんでした。
自分なりに調べたところ、どうも Qiita API の認証は OAuth の仕様とちょっと違う気がしたのでメモも兼ねて投稿します。

ご意見・ご指摘あればコメントしていただけると助かります！

:warning:  **この記事の内容は 2019年2月27日 時点での内容です。今後のQiita APIの修正・変更によって内容に差異が生じる場合があります**

## 何が困るのか

仕様と違うと仕様に準拠して作られた認証ライブラリを使って認証できません。
なのでQiita APIの認証用にちょっとライブラリを書き換えるか、最悪 自前で実装する必要がでてきます。

この記事の内容がライブラリを書き換えたり、設定する際のヒントになれば幸いです。

## 1. アクセストークン発行リクエストの Content-Type が違う

仕様では `Content-Type` は `application/x-www-form-urlencoded`
Qiita APIでは `application/json` になっている

**解説**

Qiita API の OAuth 認証ではアクセストークンの発行リクエストの `Content-Type` に `application/json` を指定するよう指示があります。

参考: https://qiita.com/api/v2/docs#post-apiv2access_tokens

しかし、OAuth 2.0の仕様では

```
クライアントはトークンエンドポイントに対して, 次のようなパラメーターを付与してリクエストを送信する. 
（中略）application/x-www-form-urlencoded フォーマットで含める.

（中略）

Content-Type: application/x-www-form-urlencoded
```

参考: https://openid-foundation-japan.github.io/rfc6749.ja.html#token-req

とあるように `Content-Type` には `application/x-www-form-urlencoded` を指定するよう仕様で策定されています。
認証ライブラリを使う場合、そのライブラリが OAuth 仕様に準拠していると `application/x-www-form-urlencoded` でリクエストを行うため Qiita API の OAuth 認証に失敗します。 
（`invalid_content_type` というエラーレスポンスが返ってきます）

Qiita でもこの `Content-Type` 問題でつまずいてる方がいらっしゃいました。

- [Twitterの「いいね」をインクリメンタルサーチできるFavsearchというWebサービスを作った](https://qiita.com/kamontia/items/5874119ab3928d2d9b6d#%E4%BD%95%E3%81%AB%E8%A9%B0%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B)
- [[R] httrでQiitaのAPI v2を使いたかった](https://qiita.com/yutannihilation/items/124d27391a2c48f2036e#rtfm)

## 2. アクセストークンレスポンスのJSONの形が違う

仕様ではJSON内のトークンのキーは　`access_token`
Qiita APIでは `token` になっている

**解説**

Qiita APIのドキュメントによると、アクセストークンのリクエストに成功すると次のようなレスポンスが返ってきます。

```
{
  "client_id": "a91f0396a0968ff593eafdd194e3d17d32c41b1da7b25e873b42e9058058cd9d",
  "scopes": [
    "read_qiita"
  ],
  "token": "ea5d0a593b2655e9568f144fb1826342292f5c6b7d406fda00577b8d1530d8a5"
}
```

参考: https://qiita.com/api/v2/docs#post-apiv2access_tokens

仕様では次のように定められています

```
アクセストークンリクエストが正当かつ認可された場合,（中略）
成功レスポンス例を以下に示す.

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"example",
    "expires_in":3600,
    "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
    "example_parameter":"example_value"
}
```
参考: https://openid-foundation-japan.github.io/rfc6749.ja.html#anchor25

Qiita APIでは肝心のトークンの key が `access_token` ではなく `token` となっています。
`Content-Type` のときと同様に OAuth 仕様に準拠したライブラリでは `access_token` を前提にするので、「トークンが取得できない」といったようなエラーが発生する可能性があります。

## まとめ
- 認証フローをQiita APIのドキュメント読みながら自分でガリガリ書いちゃう人は問題なし
- OAuth認証ライブラリを使う場合は注意。Qiitaの認証を通したい場合は自分でライブラリに手を加える必要があるかも
- 「OAuth認証」と銘打ってるのだから仕様準拠のライブラリで認証できるように Qiita さんには修正してもらいたい……
Bashでキャメルケース↔パスカルケースの変換

LowerキャメルとかUpperキャメルとも言うやつ。部分文字列と変換するだけなんだけど時々使いたくなるのでメモ：

```console
$ FOO=TestString
$ echo $(tr '[:upper:]' '[:lower:]' <<< ${FOO:0:1})${FOO:1}
testString
```

`'[:upper:]' '[:lower:]'` を逆にすると逆の変換になる。
Tridactylのcommandモードで<C-[>

[Vimperator](https://github.com/vimperator/vimperator-labs)から[Tridactyl](https://github.com/tridactyl/tridactyl)に乗り換えたときに
**commandモードで\<C-[\>を\<Esc\>として使う方法**が分からず困っていました。Vim使いとしては死活問題です。

helpをいろいろと探してみると`ex.hoge`のようなcommand line functionで出来るようです。

```
bind --mode=ex <C-[> ex.hide_and_clear
```


Command line functionを使うと

```
bind --mode=ex <C-p> ex.prev_completion
bind --mode=ex <C-n> ex.next_completion
```

も出来ました。これでTridactylがストレス無く使えそうです。

※ hintモードでも`bind`ができればいいのですが，まだ出来ないようです[^1]

  [^1]: [C-\[ doesn't escape hint mode and breaks hints #968](https://github.com/tridactyl/tridactyl/issues/968)
なおとさんの「コーディング面接した際の出題問題(Sort)」をbash で解いてみた

※個人的なエッセイを多分に含みますので、その点はご了承ください:bow_tone1:。

最近プライベートで@turmericN (なおと)さんと、とある開発プロジェクトをやっています。
その開発チームのSlack での一言…。

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/70152/c8b02b4a-b1e6-9f04-ec25-dfa226efdfce.png)

おっ:open_mouth:！

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/70152/53e0d06a-3113-6bcd-d2c7-b3670d44e6a5.png)

問題はJavaScript ということでしたが、私はLinux 愛好家:sunglasses:。ということでbash でも書いてみました。

```bash

#!/bin/bash
data="pineapple,160
apple,80
watermelon,160
grape,160
melon,80
mango,170
banana,80
strawberry,170
peach,160
orange,170
kiwi,80
"

printSortedData() {
    sort -s -t',' -k2 -n < <(printf %s "$1")
}

printSortedData "$data"

# should print
# apple,80
# melon,80
# banana,80
# kiwi,80
# pineapple,160
# watermelon,160
# grape,160
# peach,160
# mango,170
# strawberry,170
# orange,170
```

@turmericN (なおと)さんの元記事はこちらになります。

[JavaScriptのコーディング面接した際の出題問題(Sort)](https://qiita.com/turmericN/items/a5dbe3faff0bdc99f4d5)

bash にお強い方、もっとこうすれば良い等のコメント大歓迎です:bow_tone1:。
[Flutter] Flutter 1.2発表。

こんにちは！
MWC2019で、Flutter1.2が発表されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/506a22fb-252d-d3ef-7656-1510528074c6.png)

[Tag-Trends](http://sotagtrends.com/?tags=[ionic-framework,react-native,flutter,xamarin]&relative=false)によると、Flutterは1月17日頃からの上がってます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/fe85aa1d-d803-5e25-0553-0c83b928bf68.png)


#Flutter1.2からの変更点

１．Improved stability, performance and quality of the core framework.
２．Work to polish visual finish and functionality of existing widgets.
３．New web-based tooling for developers building Flutter applications.


The plug-in team has also been busy in Flutter 1.2, with work well underway to support in-app purchases, as well as many bug fixes for video player, webview, and maps. And thanks to a pull request contributed by a developer from Intuit, we now have support for Android App Bundles, a new packaging format that helps in reducing app size and enables new features like dynamic delivery for Android apps.


#Dart DevTools

https://flutter.github.io/devtools/


１．A widget inspector, which enables visualization and exploration of the tree hierarchy that Flutter uses for rendering.
２．A timeline view that helps you diagnose your application at a frame-by-frame level, identifying rendering and computational work that may cause animation 'jank' in your apps.
３．A full source-level debugger that lets you step through code, set breakpoints and investigate the call stack.
４．A logging view that shows activity you log from your application as well as network, framework and garbage collection events.

#Dart2.2の発表


２０１１に発表された、DartはMWC2019を迎えてDart2.2になります。

#Flutter Create

これすごいですよ！　参加してみませんか？
iMac Proも貰えるようです。

https://flutter.dev/create

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/bbae50a3-69e2-94e1-0a62-70c81740828c.png)
GitHubのプライベートリポジトリにホスティングされているMavenリポジトリを使う

GitHubのプライベートリポジトリでMavenリポジトリをホスティングするのはサンプルが多いのですんなりいったが、それを別プロジェクトから参照するときにハマったのでメモ。

## settings.xml

このファイルがミソです。 
この設定はGitHubにmavenリポジトリをデプロイするときにはid、username、passwordがあればよいですが、プライベートリポジトリからmavenリポジトリを参照するためにはconfigurationタグの内容を追加して、別途ベーシック認証の情報も与える必要があります。  
ちなみにidはpom.xmlで同じものを指定する必要があります。  

```xml:settings.xml
<settings>
  <servers>
    <server>
      <id>github-repo</id>
      <username>${github_user_name}</username>
      <password>${github_access_token}</password>
      <configuration>
        <httpHeaders>
          <property>
            <name>Authorization</name>
            <value>Basic ${base64 username:token}</value>
          </property>
        </httpHeaders>
      </configuration>
    </server>
  </servers>
</settings>
```
\<value\>にはユーザー名とトークンを:(コロン)で接続したものをbase64エンコードしたものを指定します。

## pom.xml

pom.xml側にはリポジトリの追加を行います。 
settings.xmlで指定したidと同じものをrepositoryに指定します。

```xml:pom.xml
<repositories>
  <repository>
    <id>github-repo</id>
    <url>https://raw.githubusercontent.com/user/repo/mvn-repo/</url>
  </repository>
</repositories>
```

ちなみにホスティングしているのがライブラリではなく、独自のMavenプラグインの場合は

```xml:pom.xml
<pluginRepositories>
  <pluginRepository>
    <id>github-repo</id>
    <url>https://raw.githubusercontent.com/user/repo/mvn-repo/</url>
  </pluginRepository>
</pluginRepositories>
```

の様にpluginRepositoriesとpluginRepositoryに変えます。
あとはdependencyを書くなり、pluginタグを書くなりします。

## ちなみに

Gradleの場合だと

```groovy:build.gradle
allprojects {
    repositories {
        maven {
            url "https://raw.githubusercontent.com/user/repo/mvn-repo"
            credentials {
                username ${username}
                password ${token}
            }
            authentication {
                basic(BasicAuthentication)
            }
        }
    }
}
```

みたいに書くと同じことが出来ます。 
こっちは他にも情報があるのでハマる人はいないでしょう。 

個人的にはGradleのほうが楽だなぁ。
Python(Flask)で簡単なWebAPIを実装する

# WebアプリにAPIの機能を付ける
今回作成するAPIは作成した掲示板サイトに蓄積されているデータを、プログラムで自動抽出するのを楽するために実装します。

以下のサイトを参考にしました。
[Python(Flask) でサクッと 機械学習 API を作る](https://qiita.com/fam_taro/items/1464c42324f15d7b8223)

ここではGETとPOSTメソッドでリクエストを送信して、受信したデータをJSON形式で出力する方法について説明します。
以下のサイトにソースコードがあります。
[Source Code](https://github.com/tomson784/bbs_api)


# GETメソッド

```python
@app.route("/api_get/<key>", methods=["GET"])
def api_get(key):
    data = {key: []}
    thread_api_get = Thread.query.filter_by(threadname=key).first()
    articles = Article.query.filter_by(thread_id=thread_api_get.id).all()
    for article in articles:
        r = {"name": article.name, "article": article.article}
        data[key].append(r)
    return jsonify(data)
```

`jsonify(data)`表示されるデータが日本語だと文字化けしてしまうので、以下の設定を追加してください。

```python
app.config['JSON_AS_ASCII'] = False
```

`http://127.0.0.1:5000/api_get/<key>`の`<key>`の部分に取得したいスレッド名を当てはめてください。
ブラウザでアクセスした時に指定したスレッドに記事が存在していれば、以下のように情報が取得できます。

![BBS - Google Chrome 2019_02_27 17_35_36.png](https://qiita-image-store.s3.amazonaws.com/0/285306/5453e3d1-9eb9-9586-82c9-2197c069b0ad.png)


# POSTメソッド

```python
@app.route("/api_post", methods=["POST"])
def api_post():
    print(request.data)
    api_data_post = request.data.decode()
    data = {api_data_post: []}
    print(api_data_post)
    thread_api_get = Thread.query.filter_by(threadname=api_data_post).first()
    articles = Article.query.filter_by(thread_id=thread_api_get.id).all()
    for article in articles:
        r = {"name": article.name, "article": article.article}
        data[api_data_post].append(r)
    return jsonify(data)
```

`http://127.0.0.1:5000/api_post/`にブラウザでアクセスすると以下のようになります。

![BBS - Google Chrome 2019_02_27 17_36_54.png](https://qiita-image-store.s3.amazonaws.com/0/285306/cf0893f3-ea6d-71b3-b243-59d7c92a8ed6.png)

POSTメソッドでのみアクセスできるようにしているので上手く表示されません。
ここでは以下のスクリプトを使ってPOSTメソッドでアクセスします。

```python
import requests

url = 'http://127.0.0.1:5000/api_post'
r = requests.post(url, data="hogehoge".encode('utf-8'))
print(r.text)
```

POSTで送信されるデータはバイナリになっているので、復号化処理を加える必要があります。

```python
request.data.decode()
```

取得結果は以下のようになります。

```json
{
  "hogehoge": [
    {
      "article": "ああああああああ",
      "name": "hoge1"
    },
    {
      "article": "いいいい　いいい",
      "name": "hoge2"
    },
    {
      "article": "うう　うう　うう",
      "name": "hoge3"
    }
  ]
}
```
Rails5のwebpacker:compile時にcompressはいらないよねっていうときの対処方法

Coloud Storageにjs, cssをアップしている場合 gutil cpで-zオプションを付けてアップロードすればよろしく圧縮してくれるので
コンパイル時間をすこしでも短縮のためcompressを無効にしたかった。

結局なにしたかというと
pluginsからCompressionを消してあげれば良いのです

```javascript:config/webpack/production.js
const environment = require('./environment')
...略

// gzipを無効にする
environment.plugins.delete('Compression')

...略
```

以上
GitHubのProjectsを一人の開発で活用する旨味はあるか

# 背景
　一人で開発を続けるためにGitHubを使うことにした。[自主勉強継続するためにGitHub使ってタスク管理をやった話](https://qiita.com/teshima/items/58ff8566f5d905a83c9e)
　そしたら、GitHubのタブにProjectsというものがあるじゃん。なにそれ便利そうじゃんと思って、使ってみようとした話。

# 目次
・GitHubのProjectsとは？
・issue作ってからcloseまでをProjects連携でやってみる
・個人の見解
・まとめ

# GithubのProjectsとは
　要は看板機能ですね。RedmineやMSのPlannerと同じ感じです。
![board.png](https://qiita-image-store.s3.amazonaws.com/0/188058/5cdb68b2-8f5c-5f80-0bbd-99c1150598f2.png)

設定していくとissueやpullrequestと連携して、うまく表示してくれるようです。

#issue作ってからcloseまでをProjects連携でやってみる
　正直、Projects自体は基本機能なので先駆者はたくさんいます。というか、説明しなくてもProjectsタブ行ってポチポチするだけです。
念のため私よりずっと説明上手そうな方の記事張っておきます。[新入社員におくるGitHubでのプロジェクト管理の初歩](https://qiita.com/gumimin/items/63dcb36d4730213bd63a)

　私はひとまず、To Do, In Progress, Doneのボードを作りました。この状態でissue作っていきましょう。下の図のNew issueからですね。Milestoneボタンから複数issueをまとめて管理することもできますが、私はissueを1機能単位で分けているので使いません。
![issue.png](https://qiita-image-store.s3.amazonaws.com/0/188058/44ed9325-44f9-2215-b5d6-6cb2dc9db004.png)
![issue2.png](https://qiita-image-store.s3.amazonaws.com/0/188058/e3a96aed-63bb-e519-a8cf-7595d9b25e12.png)

作ったら、右側のProjectsから、自分の作成したProjectを選択するのを忘れずに。
Projectsに行ってみましょう
![board2.png](https://qiita-image-store.s3.amazonaws.com/0/188058/847fdc7e-b444-40be-5505-eb904cd46c8c.png)
ほほお。追加されてますね。まあNew issueに紐づける設定したから当然ですが。

じゃあ、in Progressに移動しましょう。
![board3.png](https://qiita-image-store.s3.amazonaws.com/0/188058/5547ed75-d2a4-3c66-2e32-00f7763d6802.png)
おお、作業中ですか。じゃあ、適当にpullrequestを作りますか

![pullrequest.png](https://qiita-image-store.s3.amazonaws.com/0/188058/d478c6f9-6afd-ba2c-45cc-a17eebcdbeaa.png)
　issueの#22を関連付けて、Projectに紐づけてみました。すると？
![pullrequest2.png](https://qiita-image-store.s3.amazonaws.com/0/188058/b438dc35-4d19-efe7-63a0-27d1ce5c8f38.png)

To Doに追加されましたー。では、マージしちゃいましょう
![pullrequest3.png](https://qiita-image-store.s3.amazonaws.com/0/188058/c0ab7530-50cb-5d53-883e-4c455e9edc39.png)

はい、マージされることで、Doneに移動されました。あとはissueもcloseすれば終わりですねー。

#個人の見解
**ステップめちゃくちゃ増えとるやんけ！！！**

いや、チームでタスク管理する場合には、上記の作業のほかに、誰に作業割り当てているかとか、POがプロジェクト管理するのに使うとか、まあ便利だとは思うよ。あとpullRequestのレビュアーが別途いるとかの場合はIn Progressになったりするっぽいし。
でも、一人で開発する内容を管理するのにこのステップはいらないかなー。。。

#まとめ
　Projectは1人で運用する規模のものではないかなーと個人的には感じました。issue作って、1つずつこなして、pullrequestを閉じる。それで私は十分だと思います。
　目で見て管理できるのがよいと思う方は使ってもいいかなとは思います。そして、チームでGitHubで運用するなら、むしろ大切な機能だし、しっかり理解しておくべきとも思いました。

まあ好みの問題ですね。1人作業をする際の私には合いませんでした。おしまい。
Ubuntuのrootパスワード設定

Ubuntuはインストール直後はrootパスワードが設定されていないので、自身で設定し利用出来るようにする必要があります。
コマンドを忘れないようにメモ。

```
$ sudo passwd root
Enter new UNIX password:○○○○○○ ← 設定をしたいrootパスワード
Retype new UNIX password:○○○○○○ ← 設定をしたいrootパスワードを再度入力
passwd: password updated successfully
```

これでsu -でrootログインが可能になります。

```
$ su -
Password: ○○○○○○ ← 設定をしたrootパスワード
#
```

$が#に変わり、無事にroot権限に変わった事を確認する事が出来ました。
Ruby　コメント、変数、定数、リテラル

動作環境はMacとなります。
主に自分の勉強用メモとして残しています。


##コメント
特定の処理を向こうにしたいときや、メモを残したい時にしようする。

```comment.rb
# puts "Hello, World!" #　処理を向こうにしたいときは、プログラムの先頭に#をつける。改行までがコメント扱いとなる。
```

```
$ruby comment.rb 
$ #コメントアウトしているため出力されない。
```

**複数行コメントアウトしたい場合**

```comment.rb
=begin
puts "Hello, World!"
puts "Hello, World!"
puts "Hello, World!"
=end
# =beginから=endの間の処理がコメントアウトされる
```

```
$ruby comment.rb 
$ #コメントアウトしているため出力されない。
```

**実務上複数行に渡る場合でも、行頭に一行ごとに#をつけて実行されることが多い。**

###コメントを解除したい場合###

commandキー+/キーで解除可能 ※複数行の場合、解除したい行をまとめて選択

**メモとして残したい場合でも使用可能。**

```comment.rb
# This is a comment.　
```

```
$ruby comment.rb 
$ #コメントアウトしているため出力されない。
```

##変数

扱うデータに名前をつけて、一時的に利用できるようにしたもの

**変数名 = 式**

例
name = "suzuki"
fruit = "apple"
x = 10

```irb

#変数sに　Helloという文字列を代入
irb(main):001:0> s = "Hello!" 
=> "Hello!"
irb(main):002:0> puts s
Hello!
=> nil
#出力

#型の宣言は不要
irb(main):001:0> char s = "Hello!"　
irb(main):001:0> var s = "Hello!"　
```
数値の代入

```irb
irb(main):003:0> n = 2　*　10 #値20を変数nに代入
=> 20
irb(main):004:0> puts n　 #変数nの出力
20　
=> nil

```

変数には何かしら代入しないといけない


```irb

#変数に何も値が入っていないとエラーになる。
irb(main):005:0> i
NameError: undefined local variable or method `i' for main:Object
	from (irb):5
	from /Users/toripurug884/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'

#中身を入れて再出力
irb(main):006:0> i = nil
=> nil
irb(main):007:0> i
=> nil
#実行された！
```

##変数名の命名規則##
アルファベットの小文字かアンダースコアで始まる。
それに続けてアルファベット、数字、アンダースコアで記述する。

```irb
irb(main):014:0> price = 100
=> 100

#以下原則しないほうが良い命名規則

irb(main):015:0> price1 = 100　　#数字をつける
=> 100

irb(main):016:0> _price = 100　　#アンダースコアから始まる変数
=> 100

#数字から始まる変数名はエラーになる。

irb(main):017:0> 1price = 100
SyntaxError: (irb):17: syntax error, unexpected tIDENTIFIER, expecting end-of-input
1price = 100
     
```




```irb

#2語以上になる場合は原則_で繋げる。
#キャメルケース（単語と単語の間の文字を大文字にする）は原則使わない。

irb(main):018:0> price_cost = 100
=> 100
irb(main):019:0> priceCost = 100
=> 100
irb(main):020:0> 
```

##よくない変数の使い方##
エラーではないが、メンテナンス性が悪くなるので推奨されない変数の使い方

同じ変数に違う型を代入

```irb
irb(main):022:0> x = "abc" #文字列を代入
=> "abc"
irb(main):023:0> x = 123　#数字を代入
=> 123
irb(main):024:0> x = "def"　#文字列を代入
=> "def"
irb(main):025:0> x = [1,2,3]　#配列を代入
=> [1, 2, 3]

#同じ値を入れてしまうとわかりにくくなる
```

複数の変数に代入

```irb
irb(main):026:0> x,y = 1,2
=> [1, 2]
irb(main):027:0> x
=> 1
irb(main):028:0> y
=> 2

#あまりメリットがない。
```

```irb
irb(main):029:0> a = b = 10
=> 10
irb(main):030:0> a
=> 10
irb(main):031:0> b
=> 10

#あえて使う必要はない
```

##定数

あまり変化しない値を扱う時に使う
例）消費税、円周率、手数料など

**定数は原則全て大文字**

```irb

irb(main):032:0> TAX = 1.08 #定数TAXに値を代入
=> 1.08
irb(main):036:0> puts TAX
1.08
=> nil

irb(main):037:0> TAX_RATE = 1.08 #2語以上の定数の場合単語は_で繋ぐ
=> 1.08
irb(main):038:0> puts TAX_RATE
1.08
=> nil
```

コードのメンテナンスを保つため、定数には再代入は原則しない。


```irb
irb(main):039:0> TAX_RATE = 1.1　#一度定義した定数に再代入


#警告が出るが、再代入されてしまうので注意
(irb):39: warning: already initialized constant TAX_RATE
(irb):37: warning: previous definition of TAX_RATE was here
=> 1.1
#再代入後の値が出力される
irb(main):040:0> puts TAX_RATE 
1.1
=> nil
```

##リテラルとは
数値の123や文字列の"Hello! World"など
Rubyのプログラムの中に直接記述できる値

ソースコードに書いたもの
JavaでOCR（画像から文字認識）

## やること
OSSのtess4jを利用して画像からテキストを取得する

## Maven
[mvnrepository](https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j)からPOM.xmlへコピペ

```
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>4.3.1</version>
</dependency>
```

tess4j-4.3.1.jarがDLされる
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/368782/aaa6e074-9593-22d4-fe72-ab89b94d261c.png)

Maven使えない場合は[ここから](https://sourceforge.net/projects/tess4j/)

## 日本語認識ファイル

[GitHubのリポジトリ](https://github.com/tesseract-ocr/tessdata)から日本語の認識ファイル(jpn.traineddata)を取得


## ソース
```java:OcrTrial.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class OcrTrial {
	public static void main(String[] args) throws IOException, TesseractException {
		// 画像を読み込む
		File file = new File("C:\\work\\INPUT.JPG");
		BufferedImage img = ImageIO.read(file);

		ITesseract tesseract = new Tesseract();
		tesseract.setDatapath("C:\\work"); // 言語ファイル（jpn.traineddata））の場所を指定
		tesseract.setLanguage("jpn"); // 解析言語は「日本語」を指定

		// 解析
		String str = tesseract.doOCR(img);

		// 結果
		System.out.println(str);
	}
}
```

## INPUTにした画像ファイル
![INPUT.JPG](https://qiita-image-store.s3.amazonaws.com/0/368782/e37d1d27-a82e-6e90-5357-153fa74e5430.jpeg)

## 出力された結果
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/368782/6a114f8d-f02c-b617-c935-a6c0008dd3c9.jpeg)

## まとめ
間違いはここくらい
〇（ピクトグラム）
×　( ピ ビ ク ト グ ラ ム ) 

はっきり文字として判別できる画像であれば認識率は高そう

## 次回
- [ ] 色々な画像を試してみる
- [ ] グレースケール
- [ ] [Class Tesseract](http://tess4j.sourceforge.net/docs/docs-2.0/net/sourceforge/tess4j/Tesseract.html)の関数を理解し使ってみる
Herokuデプロイ時に「 `relative_path_from': different prefix」がでたよ

heroku本番環境にS3を使いたかったので、`gem aws-sdk`を登録し、
`bundle install`およびcommit、リモートリポジトリにpushまでしたあと

```ruby:
$ git push heroku dev:master
```
を実行したら

```ruby:
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 5.73 KiB | 2.87 MiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Ruby app detected
remote: 
remote:  !
remote:  !     different prefix: "" and "/tmp/build_edc3150bda146e5ca10eb1b67d801667"
remote:  !
remote: /app/tmp/buildpacks/b7af5642714be4eddaa5f35e2b4c36176b839b4abcd9bfe57ee71c358d71152b4fd2cf925c5b6e6816adee359c4f0f966b663a7f8649b0729509d510091abc07/vendor/ruby/heroku-18/lib/ruby/2.5.0/pathname.rb:522:in `relative_path_from': different prefix: "" and "/tmp/build_edc3150bda146e5ca10eb1b67d801667" (ArgumentError)
```

というエラーがでた。



# 解決策

`rails s`をすると、

```ruby:
$ rails s
Your lockfile is unreadable.
Run `rm Gemfile.lock` and then `bundle install` to generate a new lockfile.
```


とでたので、`rm Gemfile.lock`を実行し、`bundle install`を実行。

その後、再度`git push heroku dev:master`をすると、deploy成功。


<br>

ググってもまったくヒットしなかったので、
この記事にヒットした方は試してみてください。。


<br>

おわり
発掘: No87519.DLOOKUPについて

http://www.accessclub.jp/bbs3/0283/superbeg87519.html 

タイトル	： DLOOKUPについて
記事No	： 87519
投稿日	： 2006/09/07(Thu) 09:52
投稿者	： REAL
    OS:ＸＰ
    Access Version:2003
    行き詰ってしまいましたので、助言を頂けたらと思います。
    テーブルＡに
    フィールド1 数値型
    フィールド2 テキスト型
    フィールド3 テキスト型
    フィールド4 テキスト型
    のデータがあります。（フィールド名は変えておらず、フィールド1～フィールド4のままです。）
    テーブルＢに
    txt受付番号  数値型
    住所    テキスト型
    名前    テキスト型
    電話番号  テキスト型
    品物    テキスト型
    ・
    ・
    ・
    とあります。
    フォームのテキストボックスは
    コントロールボックス（txt受付番号）、名前（txt受付番号）
    があり、ここに数値を入れたら、同じフォーム内にあるテキストボックスに
    住所、名前、電話番号がでるようにDLOOKUPを組み込んだのですが＃Errorと表示されます。
    どこがおかしいのでしょうか？
    因みに
    住所   テキストボックス（名前：住所）
         コントロールソースDLookUp("フィールド2","テーブルＡ","フィールド1='" & [txt受付番号] & "'")
    名前   テキストボックス（名前：名前）
         コントロールソースDLookUp("フィールド3","テーブルＡ","フィールド1='" & [txt受付番号] & "'")
    電話番号 テキストボックス（名前：電話番号）
         コントロールソースDLookUp("フィールド4","テーブルＡ","フィールド1='" & [txt受付番号] & "'")
    となっています。
    いろいろ探してみたのですが、解決できなかったため、申し訳ありませんが、よろしくお願いします。


タイトル	： Re: DLOOKUPについて
記事No	： 87520
投稿日	： 2006/09/07(Thu) 10:04
投稿者	： 門戸厄神

    参考:
    http://www.accessclub.jp/bibouroku/ziten.cgi?action=view&data=30


タイトル	： Re: DLOOKUPについて
記事No	： 87521
投稿日	： 2006/09/07(Thu) 10:08
投稿者	： クロ
    おはようございます。
    > テーブルＡに
    > フィールド1 数値型
    が数値型なら
    DLookUpの第三引数は
    `"フィールド1=" & [txt受付番号])`
    でシングルクォーテーションはいらないです。
    ただ、各テキストボックスのコントロールソースに式を入れると
    表示はしますが
    > テーブルＢに
    > txt受付番号  数値型
    > 住所    テキスト型
    > 名前    テキスト型
    > 電話番号  テキスト型
    の各フィールドには代入されませんよ
    代入させるならtxt受付番号の更新後処理のイベント辺りで
    3つの式を一度に書いてください。
    各テキストボックスのコントロールソースはテーブルＢの当該フィールドになるように設定のこと


タイトル	： Re^2: DLOOKUPについて
記事No	： 87529
投稿日	： 2006/09/07(Thu) 11:10
投稿者	： REAL
    クロさんありがとうございます。
    > > テーブルＡに
    > > フィールド1 数値型
    >
    > が数値型なら
    > DLookUpの第三引数は
    > `"フィールド1=" & [txt受付番号])`
    > でシングルクォーテーションはいらないです。
    >
    > ただ、各テキストボックスのコントロールソースに式を入れると
    > 表示はしますが
    DLookUp("フィールド2","テーブルＡ","フィールド1=" & [txt受付番号])
    と直したのですが、まだエラーがでてしまうのですが・・・。まだどこかおかしいのでしょう？


タイトル	： Re^3: DLOOKUPについて
記事No	： 87530
投稿日	： 2006/09/07(Thu) 11:21
投稿者	： REAL
    クロさんすいません
    できました！！ありがとうございます。
    ただ、入力後には正しく表示されるのですが、
    入力前の状態だと、各テキストボックスにはエラーと表示されます。
    これはどうにもならないんでしょうか？


タイトル	： Re^3: DLOOKUPについて
記事No	： 87531
投稿日	： 2006/09/07(Thu) 11:29
投稿者	： 門戸厄神
    `DLookUp("フィールド2","テーブルＡ","フィールド1=" & Nz([txt受付番号],0))`


タイトル	： Re^4: DLOOKUPについて
記事No	： 87533
投稿日	： 2006/09/07(Thu) 11:42
投稿者	： REAL
    門戸厄神さんありがとうございます。
    できました！
「ハッキング・ラボのつくりかた」Metasploit persistence(P259)での「EXE::CUSTOM」誤記について

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことの詳細内容です。
著者様[@ipusiron](https://twitter.com/ipusiron)の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)がありますので、そちらもご確認頂ければと思います。
## その他トラブルへの目次
[「ハッキング・ラボのつくりかた」体験学習トラブルの記録](https://qiita.com/ss_tom_jp/items/d041d78c0fd07e0c8ed4)

# トラブル詳細
## 4-1 Windows 7のハッキング
### P259: Metasploit persistenceでの「EXE::CUSTOM」誤記について
※[正誤表](https://www.shoeisha.co.jp/book/detail/9784798155302#errata)には記載がありません(2019/02/24現在)。
`persistence`の設定例(P259下図)で、図中下から３行目に`EXE::CUSTOM`とありますが、`EXE::Custom`のように最後の５文字分は小文字が正解のようです。`show advanced`で表示される内容も`EXE::Custom`と小文字が混じっているのでおそらく書籍の誤記と思われます。

#### 解決方法
```ruby
#正
msf exploit(persistence) > set EXE::Custom /root/Desktop/evil.exe
#誤
msf exploit(persistence) > set EXE::CUSTOM /root/Desktop/evil.exe
```

# おわりに
少しでもお役にたてればうれしいです。
「ハッキング・ラボのつくりかた」Virtual Boxマネージャ「IE8-Win7」アイコンに「アクセスできません」が表示されていて起動が行えない

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことの詳細内容です。
著者様[@ipusiron](https://twitter.com/ipusiron)の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)がありますので、そちらもご確認頂ければと思います。
## その他トラブルへの目次
[「ハッキング・ラボのつくりかた」体験学習トラブルの記録](https://qiita.com/ss_tom_jp/items/d041d78c0fd07e0c8ed4)

# トラブル詳細
## 4-1 Windows 7のハッキング
###  Virtual Boxマネージャ「IE8-Win7」アイコンに「アクセスできません」が表示されていて起動が行えない
下図のように`IE8-Win7`アイコンに`アクセスできません`が表示され`Windows7`の起動が行えなくなりました。
<img width="540" alt="Win7 Vbox Error1.png" src="https://qiita-image-store.s3.amazonaws.com/0/246506/6e836d3d-96be-60a5-e0d4-1e5609f4ad19.png">
#### 解決方法
仮想マシンの設定ファイルから`VirtualBox Guest Additions`に関する設定を削除します。
`VirtualBox`は起動せずに削除を行い、削除後、`VirtualBox`を再起動してください。
その①で解決しない場合には、その②、その③を試してみてください。
##### その①
`VirtualBox Guest Additions`に関する設定を、次の２つのファイルから削除します。

+ IE8 - Win7.vbox
+ IE8 - Win7.vbox-prev(下図参考)

※`[VirtualBox マネージャ]` --> `[Tools]` --> `[一般]` --> `[デフォルトの仮想マシンフォルダ]`内の`[IE8 - Win7]`フォルダに両ファイルがあります。
※両ファイルをコピーしておけばミスした時に復旧が行いやすいかと思います。(その②で記載しますが別フォルダにコピーを作成したほうが良いかもしれません)
<img width="815" alt="Win7 Vbox Error.png" src="https://qiita-image-store.s3.amazonaws.com/0/246506/43442dd6-834a-d125-eb8d-d177369ed634.png">

##### その②
その①で解決されない場合、`IE8 - Win7.vbox`と`IE8 - Win7.vbox-prev`両ファイルのコピーを元ファイルと同一フォルダ内にコピーしてあることが原因かもしれません。コピーしたファイルを別フォルダに移動して`VirtualBox`を再起動してみてください。

##### その③
`[VirtualBox マネージャ]` --> `[Tools]` --> `[一般]` --> `[デフォルトの仮想マシンフォルダ]`内の`Kali-Linux-2018.4-vbox-amd64`にその①と同様ファイルがあります。その①同様に`VirtualBox Guest Additions`に関する設定を削除してみてください。

##### 補足
私の環境では、その②その③ともに行わないと解決しませんでした。また解決後にその②の手順を無効（コピーしたファイルを元フォルダに戻す）にしてみましたが、トラブル再現しませんでした…　なお、あまり深追いはしていません。

# おわりに
少しでもお役にたてればうれしいです。
「ハッキング・ラボのつくりかた」Guest Additionsをインストールする項でCDアイコンがデスクトップに現れない

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことの詳細内容です。
著者様[@ipusiron](https://twitter.com/ipusiron)の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)がありますので、そちらもご確認頂ければと思います。
## その他トラブルへの目次
[「ハッキング・ラボのつくりかた」体験学習トラブルの記録](https://qiita.com/ss_tom_jp/items/d041d78c0fd07e0c8ed4)

# トラブル詳細
## 3-7 VirtualBoxのファイル共有機能を利用する
### P153: ③Guest Additionsをインストールする項でCDアイコンがデスクトップに現れない
[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)に記載されていることで基本的には解決するかと思います。しかしながら私の環境では`VBoxLinuxAdditions.run`スクリプト実行前後に再起動しても`CDアイコン`は表示されませんでした。

#### 解決方法
私のように`CDアイコン`が表示されないこともあるかと思いますが、マウントは成功すると思います。
[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)の解決方法をお試しください。`GUI`による解決方法でも`CUI`による解決方法のどちらでも大丈夫かと思います。
私はより`LINUX`っぽさを感じるため`CUI`による解決方法を試しました。
![VirtualBox_Kali-Linux-2018.4-vbox-amd64_16_02_2019_14_12_49.png](https://qiita-image-store.s3.amazonaws.com/0/246506/8bd89902-b564-9646-12ec-0bcdbba462c0.png)
無事にマウントできていることを下図から確認できるかと思います。
![VirtualBox_Kali-Linux-2018.4-vbox-amd64_16_02_2019_20_29_27.png](https://qiita-image-store.s3.amazonaws.com/0/246506/2f009336-5900-cf7f-a763-7450c48c91fd.png)
####ご参考①
`P154下図`中に`(途中でyes)`と答えるとありますが下記赤枠上のように表示されるかと思います。また`yes`入力後の経過は赤枠下のようになるかと思います。
!<img width="368" alt="VirtualBox_Kali-Linux-2018.4-vbox-amd64_16_02_2019_19_35_00 - コピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/246506/86d24387-5565-a83e-b34b-3bceeb79dc80.png">

# おわりに
少しでもお役にたてればうれしいです。
「ハッキング・ラボのつくりかた」Kaliを起動するの項でKali Linuxが起動しない

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことの詳細内容です。
著者様[@ipusiron](https://twitter.com/ipusiron)の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)がありますので、そちらもご確認頂ければと思います。
## その他トラブルへの目次
[「ハッキング・ラボのつくりかた」体験学習トラブルの記録](https://qiita.com/ss_tom_jp/items/d041d78c0fd07e0c8ed4)

# トラブル詳細
## 2-5 初めてのKali Linux
### P44: ①Kaliを起動するの項でKali Linuxが起動しない
`Kali Linux`ダウンロード後、`VirtualBox`へのインポートを行い`Kali Linux`を起動すると、`VitualBox`からエラーメッセージが表示されたり、`Kali Linux`が黒画面のまま先に進まないような状態となりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246506/87d8a700-242f-d99c-c86e-74f37c690142.png)

#### 解決方法
`Windows10`機能の設定と`Bios`機能の設定が影響していました。私の環境で`Kali Linux`が起動した設定内容を記載します。

|  種類  |  設定名  |  設定内容  |
| ---- | ---- | ---- |
|  Windows10  |  Windows ハイパーバイザプラットフォーム  |  未チェック  |
|  BIOS  |  Intel Virtual Technology  |  Enabled  |

+ Windows10 - ハイパーバイザプラットフォーム -
`[コントロールパネル]` --> `[プログラム]` --> `[プログラムと機能]` --> `[Windowsの機能の有効化または無効化]` から `[Windows ハイパーバイザプラットフォーム]`設定を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246506/aac4e986-5586-47e0-a0b2-8e0722d721c7.png)

+ BIOS - Intel Virtual Technology -

`[Windows10起動状態からShiftキー押しながら再起動]` --> `[トラブルシューティング]` --> `[詳細オプション]` --> `[UEFI ファームウェア設定]` --> `[再起動する]` から`BIOS`に移行させ`[Intel Virtual Technology]`設定を行います。
※BIOS起動方法はいくつかあるようですが難なくBIOS起動行えた方法を記載

+ Windows ハイパーバイザプラットフォーム と Intel Virtual Technology 設定の関係性

| kali Linux 起動結果 |  Windows ハイパーバイザプラットフォーム  |  BIOS Intel Virtual Technology  |  状態  |
| ---- | ---- | ---- | ---- |
|  OK |  未チェック |  Enabled  |  正常起動  |
|  NG |  未チェック |  Disabled  |  仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした  |
|  NG |  チェック  |  Enabled  |  黒画面のまま進まない  |
|  NG |  チェック  |  Disabled  |  仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした  |

# おわりに
少しでもお役にたてればうれしいです。
「ハッキング・ラボのつくりかた」Kali Linuxをダンロードするの項でダウンロードが行えない

# はじめに
「[ハッキング・ラボのつくりかた](https://www.shoeisha.co.jp/book/detail/9784798155302)」で体験学習を行うにあたり、書籍通りに進めずトラブッたことの詳細内容です。
著者様[@ipusiron](https://twitter.com/ipusiron)の[FAQ](http://s-akademeia.sakura.ne.jp/main/books/lab/faq.html)がありますので、そちらもご確認頂ければと思います。
## その他トラブルへの目次
[「ハッキング・ラボのつくりかた」体験学習トラブルの記録](https://qiita.com/ss_tom_jp/items/d041d78c0fd07e0c8ed4)

# トラブル詳細
## 2-4 VirtualBoxにKali Linuxを導入する
### P39: ②Kali Linuxをダンロードするの項でダウンロードが行えない
`Microsoft Edge`を使用していないでしょうか？ 
`Microsoft Edge`から[Kali Linux Vbox 64 Bit Ova](https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/)ファイルのダウンロードを行うと`Microsoft Edge`はブラウザ上に`OVAファイル`の中身を表示してしまいダウンロードが行えませんでした。
<img width="767" alt="edge ova.png" src="https://qiita-image-store.s3.amazonaws.com/0/246506/40144539-30f1-b749-3f17-ab3c56417259.png">
#### 解決方法
単純ですが、`Chrome`を利用してダウンロードを行いました。
# おわりに
少しでもお役にたてればうれしいです。
MVC　概要

#そもそもMVCとは？
MVCは`Model`、`View`、`Controller`の頭文字をとったもの。
大まかに言うとこれら３役がそれぞれ役割を担っていて、アプリケーションを作っていく上での考え方や概念といった基盤になる。
ここにデータベースやルーティングが絡んできて、アプリケーションの動きによってサイクルができる。
#なぜMVCを考えなければいけない？
アプリケーションが簡単なうちはどこがどうなっているのかは把握できるかもしれないが、どんどん複雑になっていく上でその管理が難しくなってくる。
そこでMVCという考え方を持っていればそれぞれが役割を担っているためどこに何があるか把握ができ、状態の管理がしやすくなる。
#Model
既存のデータベースをいじれるメソッドを色々持っている。ビジネスロジックと呼ばれるかも。
ここで書くコードとして、データベース上のどのカラムをいじれるかの設定や、データベースのテーブル同士でリレーションをつけたりする。

```php:モデル名.php
//いじれるカラム名を指定する、$fillableではなく$guardedを使っていじれないカラムを指定する方法もある。

protected $fillable = [
    'column1',
    'column2',
];

//このモデルに付随するテーブルの１要素が、
//Exampleモデルに付随するテーブルの複数要素と関係性をもつことを表している。
//他にも$this->belongsToにしてこのテーブルは指定したテーブルの１要素と関係性をもつことを表すこともできる。

public function examples()
{
    return $this->hasMany('\App\Example');
}
```
#Controller
`Model`と`View`の間に立つものと考える。
ここではモデルを`use`してモデルのメソッドを使ってデータベースから取得したデータを`View`に渡したり、`View`から入力された値に対してバリデーションをつけたりすることができる。
また、モデルのメソッドを使って新たにデータベースのテーブルに値を追加することもできる。

```php:コントローラ名.php
use App\Example;

//Exampleモデルに付随するテーブルから、作られた時期の降順で取得し、
//view関数を使ってpages.indexファイルに取得したデータを連想配列で渡す。

public function index()
{
    $examples = Example::orderBy('created_at', 'desc')->get();

    return view('pages.index', ['examples' => $examples]);
}

//フォームからの入力を新たにデータベースに追加する関数

public function store(Request $request)
{

//$rulesでバリデーションを指定している。
//'required'は必須項目で、'email'はメール形式を指定してvalidate関数を使う。

    $rules = [
        'example1' => ['required'],
        'example2' => ['requierd', 'email'],
    ];

    $this->validate($request, $rules);

//モデルのcreateメソッドを使ってデータベースに追加する。

    Example::create([
        'example1' => $request['example1'],
        'example2' => $request['example2'],
    ]);

//トップページに遷移する

    return redirect('/');
}

```
#View
`Controller`から受け取ったデータを画面に表示する。

```php:ビュー名.blade.php

//foreachを使ってコントローラで取得したデータのタイトルを表す。

<div>
    @foreach($examples as $example)
        <div>
            {{  $example->$title }}
        </div>
    @endforeach
</div>
```
#まとめ
`MVC`について簡単にまとめました。
Laravelをもっと深く理解したいです。。
VBA Powerpointの参照設定をイミディエイトに出力する Wordはファイルに出力する Powerpoint And WinWord Export Reference Settings


#Outlook Publisherはこの機能がないらしい
PowerpointとPublisherは似ているのですが、ここが全く違います。
#必ず下記の参照設定が必要です
Microsoft Visual Basic for Applications Extensibility X.X
現在は5.3のようです。
これをしないと動きません。
またWordは
Microsoft Scripting Runtimeも参照設定しています。
Wordで使っているのはダブルクォーテーションで包み、コンマまたは改行を付加する関数です。
https://qiita.com/Q11Q/items/0c956f9bbdb7efee56f0

#Powerpoint

```vb
Sub ExoirtPowerpointaRefsettings()
'Powerpointの参照設定を出力する
Dim pp As PowerPoint.Presentation: Set pp = ActivePresentation
Dim VP As VBProject
Dim ref As Reference, refs As References
Set VP = Application.VBE.ActiveVBProject
Set refs = VP.References
For Each ref In refs
Debug.Print ref.Name
Next
End Sub
```
#Word

```vb
Sub ExportWordVBARefs()
'FilesystemObjectは参照設定
'出力先は
Const ExportFileFullPath = "D:\wdList.txt"
Dim wd As Word.Document: Set wd = ThisDocument
Dim refs As VBIDE.References, ref As VBIDE.Reference
Dim Ts As TextStream, FSO As New Scripting.FileSystemObject
Set Ts = FSO.OpenTextFile(ExportFileFullPath, ForAppending, True)
Set refs = Application.VBE.ActiveVBProject.References
For Each ref In refs
On Error Resume Next
If ref.IsBroken = False Then
Ts.Write RpDqtc(ref.Name) & RpDqtc(ref.Major) & RpDqtc(ref.Minor) & RpDqtc(ref.Description) & RpDqtc(ref.FullPath) & RpDqtc(ref.GUID) & RpDqR(ref.Type)
Else
Ts.Write RpDqtc(ref.Name) & RpDqtc("Broken") & "" & "" & vbCrLf
End If
If Err.Number <> 0 Then Debug.Print ref.Name, Err.Number, Err.Description: Err.Clear
Next
Ts.Close
End Sub

Function RpDqtc(varString) ' As String
' String Return With DoubleQuotation Such As
' Dog => "Dog" ,
' wRapping with DoubleQuoTation
'RpDqtc=chr(34) & varString & chr(34) & ","
On Error Resume Next
If TypeName(varString) = "Date" Then
RpDqtc = Chr(34) & CDate(varString) & Chr(34) & Chr(44)
Else
RpDqtc = Chr(34) & CStr(varString) & Chr(34) & Chr(44)
End If
Exit Function
On Error GoTo 0
If Err.Number <> 0 Then
Err.Clear
RpDqtc = Chr(34) & Chr(34) & Chr(44)
Exit Function
End If
End Function
Function RpDqR(varString) ' As String
' String Return With DoubleQuotation Such As
' Dog => "Dog" & VbCrLf
' wRapping with DoubleQuoTation
On Error Resume Next
If TypeName(varString) = "Date" Then
RpDqR = Chr(34) & CDate(varString) & Chr(34) & vbCrLf
Else
RpDqR = Chr(34) & CStr(varString) & Chr(34) & vbCrLf
End If
Exit Function
On Error GoTo 0
 If Err.Number <> 0 Then
 'Wscript.Echo Err.Number, Err.Description
  Err.Clear
  RpDqR = Chr(34) & Chr(34) & vbCrLf: Exit Function
  End If
End Function
```
Linuxユーザの鍵ファイルをまとめて変更・ユーザを一括削除するスクリプト

# 最近まで課題だったこと

弊社の社内（ぼくが所属する部門）には誰かが作成した公開鍵をまとめて登録し、ユーザも発行してくれるツールがあります。
これはこれで便利なのですが、いかんせん登録することしかできないので、後からPC壊れて鍵の交換が必要になった、と言われた時は手作業での変更作業だったりします。
それが毎回地味にめんどくせってなってるので、ShellScriptでそれなりに動作する仕組みを作りました。

そもそもLDAPでやるって方法もあるんですけどネ。
案件が多数あるから結局どこかしらで入れ替えるための方法を検討することになっていたわけでございます。

## 鍵ファイルを変更するスクリプト

既存の登録するスクリプトを見つつ、これならできるんじゃないか感を感じたので別スクリプトで作ってみました。
引数追加して全てをまとめても良かったのですが、分けた方が運用上のミスも避けれるだろう、ということもあって分けました。

```shell
#!/bin/sh
set -eu

for data in `cat $1 | grep -v "#"`
do
    user=`echo $data| cut -f 1 -d :`
    if [ -z $(getent passwd ${user}) ]
    then
        echo ${user} does not exist.
    else
        echo ${user} exists and pub key is changed.
        install -m 600 -g xxxx -o ${user} ${user}.pub /home/${user}/.ssh/authorized_keys
        ls -la /home/${user}/.ssh/authorized_keys
    fi
done
```

これは単独では動作しないようになっています。

### 前提条件

- 変更対象者のユーザ名を一覧にしたファイルがあること。
- 変更対象の鍵ファイルが存在すること。
- 鍵ファイルとユーザ名が一致していること。

という三つの前提条件があります。

### 書き換え箇所

以下のxxxxと記載している、1箇所を各環境に合わせて書き換えていただくようにお願いします。

```
        install -m 600 -g xxxx -o ${user} ${user}.pub /home/${user}/.ssh/authorized_keys
```

### 作った感想

たったこれだけで鍵ファイルを交換できるんならもっと早くからやっとくべきだった。
なお、Ansibleからも呼び出せるようになっています。
Ansible側は弊社オリジナルのカスタマイズが入っていますので参考にはならない部分があると思います。

## Linuxユーザをまとめて削除するスクリプト

と言っても `userdel -r` すれば良いじゃんという話もあるのですが、それやっちゃうとホームディレクトリもごっそり消え、あとあとその人のところにしかなかった！なんてことがあるので、そういうことも防ごうと考えました。
また、弊社は最近はないのですが、出戻りでまた再度入社される方が少なからずいらっしゃいます。
そういうことを諸々考慮したスクリプトを作成しました。

それがこちらです。

はい、ドーン！

```shell
#!/bin/sh
set -eu

for data in `cat $1 | grep -v "#"`
do
    user=`echo $data| cut -f 1 -d :`
    if [ -z $(getent passwd ${user}) ]
    then
        echo ${user} does not exist.
    else
        echo ${user} exists and retire.
        userdel ${user}
        retire_date=`date +"%Y%m%d_%H%M%S"`
        mv /home/${user} /home/RETIRE/${user}.${retire_date}
    fi
done
```

### 前提条件

こちらの前提条件も記載しますが、鍵を変更するスクリプトとほぼ同じです。

- 変更対象者のユーザ名を一覧にしたファイルがあること。
- RETIREディレクトリが存在すること

RETIREディレクトリが気に入らなければ別のディレクトリ名として作成いただき、スクリプトも書き換えていただければと思います。

### 作った感想

これはこれで便利です。
あとでこの人いつ辞めたっけ？がわかりますし、元のディレクトリを使うかどうかも選択できます。
また辞めても同一ディレクトリで上書いてしまうようなこともなく、安全設計です。
この処理に不足があるとしたら、/var/内にmailデータが残ってることですかね。

弊社は踏み台などでmailを使うことはないのでさほどの問題じゃないと思っています。
削除処理も合わせて対応できる範囲かと思いますので、ご自由にどうぞーー。

# まとめ

他にもEC2インスタンスのセキュリティグループを調査するのに作ったスクリプトとかもありますが、ちょっと今回は記載いたしません。
理由としては案件毎にmarkdownでAWSで構築した情報をメモしているのですが、便利なスクリプトになってからアウトプットしても良いかなーと考えています。
モーダル（ポップアップ）からコントローラへの値の渡し方

モーダル（ポップアップのようなもの）から値を受け取れず、この二日間泥沼にはまっていました。
完全に給料泥棒ですwww

何がしたかったかというと具体的には、ユーザがとあるuiSwitchをオンにしたらモーダルが表示されて、そのモーダルが正常に閉じられたらそのまま、異常な閉じ方をされたらuiSwitchオフに戻すといった処理をしたかったわけです。

状況としては
①mainのコントローラでxibのviewを作成（このview上にuiSwitchがある）
②ユーザがそのスイッチを押してモーダル（storyboard）を開く
③ユーザがモーダルの閉じるボタンを押す
④閉じられたことをxibに伝えてスイッチをオフにする

やりたかったことはこれだけです。


流れとしては、閉じられたという情報を

①モーダルのコントローラ(UIViewControllerを継承）
②→mainのコントローラ(UIViewControllerを継承）
③→xibのコントローラ（UIViewを継承）

と伝えていこうかなと思ったわけです。


まずはお手軽そうな②から③、つまりmainのコントローラからxibへ情報伝達する部分を実装しました。

```swift:MainController.swift
class MainController: UIViewController {
    // xibのコントローラをインスタンス化
    let xib = Xib()
  
    // xibに設置されたuiSwitchをオフに
    func setUISwitchOff(){
        xib.uiSwitch.isOn = false
    }
}
```


```swift:Xib.swift
class Xib: UIView {
    // ↓こいつはviewと紐づいてます
    @IBOutlet weak var uiSwitch: UISwitch!
    }
}
```

これで、mainのコントローラのsetUISwitchOff()を発動すればいつでもxibのuiswitchをオフにできますね。

では①から②、つまりモーダルからmainのコントローラに情報を伝達するにはどうすればいいのか。

使えそうだと目をつけたのは、

<font color="Red">presentingViewController</font>

まんま、今見てるビューを司るコントローラを取得できるやつです。
これを使えばモーダルのコントローラの中でmainコントローラをインスタンス化できるだろうと。

強制ダウンキャストが必要だとのことだったので

```swift:ModalController.swift
class ModalController: UIViewController{
    @IBAction func closeBtnAction(_ sender: UIButton) {
        // 閉じるボタンを押されたらモーダルを消します
        self.dismiss(animated: false, completion: nil)

        // メインのコントローラに強制ダウンキャスト
        let originVC = self.presentingViewController as! MainController
        // setUISwitch()を発動してXibのスイッチをオフに！！
        originVC.setUISwitchOff()
    }
}
```


決まった！！！！


…当然そう甘くはなくて
「navigationControllerをMainControllerにキャストできません」
的なエラーが出ました。

あ、はい



どうしよ




「あ、こいつnavigationControllerなのか！！なんか聞いたことあるぞ！！」


調べました。
そしたらどうやら、navigationControllerの一番上のコントローラを取って来なけりゃいけないらしく

```swift:ModalController.swift
class ModalController: UIViewController{
    @IBAction func closeBtnAction(_ sender: UIButton) {
        // 閉じるボタンを押されたらモーダルを消します
        self.dismiss(animated: false, completion: nil)

        // とりあえずキャスト
        let naviVC = self.presentingViewController as! UINavigationController
        // 一番上のコントローラを取得し、そいつはMainControllerだからキャスト！！
        let originVC = naviVC.topViewController as! MainController
        originVC.setUISwitchOff()
    }
}
```


なんと、これでいけました。

できてしまえば簡単だな


と言いたいところですが、ふつーにわかりにくいと思いました。



もっと簡単なやり方があったんじゃないかと思います。まる
cdした後にlsするのはzshにやらせよう。

# はじめに
cdしたあとlsする関数を作ろうかと思ったけど、
[enhancd](https://github.com/b4b4r07/enhancd)というものを使い倒してるのでそこらへんとの兼ね合いが面倒くさそうで、
なにかいい方法がないかなと思ったらあった。

# 最終的な形

```zsh:.zshrc
chpwd() {
	if [[ $(pwd) != $HOME ]]; then;
		ls
	fi
}
```

# 解説
こんかいのキモとなるのは`chpwd()`こいつ。
我らがzshにはhook関数なるものが実装されている。
こいつらは`プロンプトを表示する直前`だったり`Enterを押してコマンドを実行する直前`だったり、
様々な条件に応じて発火するものが備わっている。

詳細な話はこの記事がとてもいい感じに纏まっているのでそっちに丸投げ。
[zshでhook関数を登録する - Qiita](https://qiita.com/mollifier/items/558712f1a93ee07e22e2)

そして、今回はそのhook関数の中の`カレントディレクトリが変更されたとき`に発火する`chpwd`なるものを用いる。

```zsh:.zshrc
chpwd() {
	ls
}
```
zshrc内でchmodにこんな感じで`ls`をする処理を書いてあげると、カレントディレクトリを変更したときに自動でlsしてくれるようになる。

ただ、これだとただcdしたときにホームディレクトリの中身がlsでウワーってなるので、

```zsh:.zshrc
chpwd() {
	if [[ $(pwd) != $HOME ]]; then;
		ls
	fi
}
```
ifで、現在のディレクトリ(`pwd`)が ホームディレクトリ`$HOME`と同じじゃなかったら`ls`。と制御してあげる。
\

# 蛇足
cdした際にいちいち出てくるの煩わしいかなーって思ったけど、大きなディレクトリの移動は[enhancd](https://github.com/b4b4r07/enhancd)でゴリっと移動できるし、`cd hogehoge`で細かく移動するときはディレクトリ見ながら移動したいので`ls`の手間が省けて良さげ。
macにPHPとapacheをbrewから入れてみた

大変すぎた。元々入ってるphpとapacheが邪魔しまくってきたのでログを取っておく
CakePHPで作ったプロジェクトが動くところはまでは行くかと思います。

## 何はともあれ、まずhomebrewの最新化
```$ brew update
```

## PHPインストール
##### PHPの検索
```$ brew search php```
##### php7.1(お好きなバージョン)をインストール
```$ brew install php@7.1```
##### インストールしたPHPを使うように設定変更
```$ brew link php@7.1```
上記で出てきた以下のコマンドを実行する
```$ echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile```
```$ echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile```
##### 設定変わったか確認
```$ which php```
> /usr/local/opt/php@7.1/bin/php

## apacheをインスール
##### 元から入ってるapacheの自動起動を止める
```$ sudo apachectl stop```
```$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist```
##### apacheを検索
```$ brew search httpd```
##### apacheをインストール
```$ brew install httpd```
##### 設定変更
```$ vi /usr/local/etc/httpd/httpd.conf```
##### コメントを外す
```#LoadModule userdir_module lib/httpd/modules/mod_userdir.so```
```#Include /usr/local/etc/httpd/extra/httpd-userdir.conf```
```#LoadModule rewrite_module modules/mod_rewrite.so```
##### LoadModuleしてる辺りに追記
```
LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so
<IfModule php7_module>
  AddType application/x-httpd-php .php
</IfModule>
```
##### 書き換え
```#ServerName www.example.com:8080```
↓
```ServerName localhost```

```DirectoryIndex index.html```
↓
```DirectoryIndex index.php index.html```

```
DocumentRoot "/usr/local/var/www"
<Directory "/usr/local/var/www">
```
↓

```
DocumentRoot "作成しているプロジェクトのディレクトリ"
<Directory "作成しているプロジェクトのディレクトリ">
```

##### 上で書き換えた<Directory>の中を変更
```AllowOverride None```
↓
```AllowOverride All```

## mysqlをインストール
```$ brew search mysql```
```$ brew install mysql@5.6```
```$ brew link mysql@5.6```
```$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile```

##### mysql起動
```$ source ~/.bash_profile```
```$ mysql.server start```

##### mysql.sockの設定
```$ mysqladmin version```
UNIX socket　っという項目の後に書いてあるmysqld.sockファイルの場所を記録
/usr/local/etc/php/7.1/php.iniに記述する
pdo_mysql.default_socket=[sockファイル]

```$ apachectl start```